I have this code:
class SomeClass: @classmethod def func1(cls,arg1): #---Do Something--- @classmethod def func2(cls,arg1): #---Do Something--- # A 'function map' that has function name as its keys and the above function # objects as values func_map={'func1':func1,'func2':func2} @classmethod def func3(cls,arg1): # following is a dict(created by reading a config file) that # contains func names as keys and boolean as values that tells # the program whether or not to run that function global funcList for func in funcList: if funcList[func]==True: cls.func_map[func](arg1) #TROUBLING PART!!! if _name__='main' SomeClass.func3('Argumentus-Primus')
When I run this I keep getting the error:
Exception TypeError: "'classmethod' object is not callable"
I am unable to figure out what is wrong with this and would appreciate your help.
You can't create references to classmethods until the class has been defined. You'll have to move it out of the class definition. However using a global function map to decide what gets run is really awkward. If you described what you are trying to do with this, we could probably suggest a better solution.
class SomeClass(object): @classmethod def func1(cls, arg1): print("Called func1({})".format(arg1)) @classmethod def func2(cls, arg1): print("Call func2({})".format(arg1)) @classmethod def func3(cls, arg1): for fnName,do in funcList.iteritems(): if do: try: cls.func_map[fnName](arg1) except KeyError: print("Don't know function '{}'".format(fnName)) # can't create function map until class has been created SomeClass.func_map = { 'func1': SomeClass.func1, 'func2': SomeClass.func2 } if __name__=='__main__': funcList = {'func1':True, 'func2':False} SomeClass.func3('Argumentus-Primus')
I discovered something tonight that will be helpful here: We can unwrap magic staticmethod
and classmethod
objects via: getattr(func, '__func__')
How did I find this information? Using JetBrains' PyCharm (I don't know about other Python IDEs), I viewed the source code for @staticmethod
and @classmethod
. Both classes define the attribute __func__
.
"The rest is left as an exercise for the reader."
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With