Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Various errors in code that tries to call classmethods [closed]

Tags:

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.

like image 560
user1126425 Avatar asked Jun 15 '12 21:06

user1126425


2 Answers

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') 
like image 88
Hugh Bothwell Avatar answered Oct 21 '22 08:10

Hugh Bothwell


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."

like image 39
kevinarpe Avatar answered Oct 21 '22 06:10

kevinarpe