I write a function that gets a filename, reads out information from the file and creates a Read object out of it.
def read_file(filename):
with open(filename, 'r') as filetoread:
readList = []
for line in filetoread:
readList.append(Read(line))
return readList
This implementation works.
Now I want to generalize my function and make it work for two object/class types: Read and Reference.
So I want to use a class name as a parameter of a function.
The function gets a filename and a classname now. It reads out information from the file and creates an object of a specified classname out of it.
My attempt lookes like this.
def read_file(filename, classname):
with open(filename, 'r') as filetoread:
readList = []
for line in filetoread:
readList.append(classname(line))
return readList
I get TypeError: 'str' object is not callable.
My idea was using this solution:
def str_to_class(classname):
return getattr(sys.modules[__name__], classname)
Source: Convert string to Python class object?
I still get an error though (TypeError: getattr(): attribute name must be string)
The error:
TypeError: 'str' object is not callable.is telling you your problem.For an object to be "callable" it must implement the
__callable__()magic method. Strings do not implement this method, and therefore you get this error.But wait! You know what does implement
__callable__()? Classes!Now rather than trying to do some conversion, just pass in the raw characters. This classname is a
tokenand will be treated as such.Therefore when calling your function
Use:
read_file("myFile.txt", Read)and NOT:
read_file("myFile.txt", "Read")