如何获取有关函数的信息并调用它

时间:2009-07-31 13:48:57

标签: python

我想创建一个函数来检测给定实例是否存在方法,可以传入的参数是什么,然后使用适当的参数调用该方法。我是新手,我不知道该怎么做:(

4 个答案:

答案 0 :(得分:3)

尝试hasattr

>>> help(hasattr)
Help on built-in function hasattr in module __builtin__:

hasattr(...)
    hasattr(object, name) -> bool

    Return whether the object has an attribute with the given name.
    (This is done by calling getattr(object, name) and catching exceptions.)

有关inspect模块的更高级内省,请阅读

但首先,请告诉我们您为什么需要这个。有99%的可能存在更好的方式......

答案 1 :(得分:1)

Python支持duck typing - 只需在实例上调用方法。

答案 2 :(得分:0)

您是否尝试将参数值与具有未知签名的函数对齐?

您如何匹配参数值和参数变量?猜?

你必须使用某种名称匹配。

例如类似的东西。

someObject.someMethod( thisParam=aValue, thatParam=anotherValue )

喔。等待。这已经是Python的一流部分了。

但如果该方法不存在(出于莫名其妙的原因)该怎么办。

try:
    someObject.someMethod( thisParam=aValue, thatParam=anotherValue )
except AttributeError:
    method doesn't exist.

答案 3 :(得分:0)

class Test(object):
    def say_hello(name,msg = "Hello"):
        return name +' '+msg

def foo(obj,method_name):
    import inspect
    # dir gives info about attributes of an object
    if method_name in dir(obj):
        attr_info = eval('inspect.getargspec(obj.%s)'%method_name)
        # here you can implement logic to call the method
        # using attribute information
        return 'Done'
    else:
        return 'Method: %s not found for %s'%(method_name,obj.__str__)

if __name__=='__main__':    
    o1 = Test()
    print(foo(o1,'say_hello'))
    print(foo(o1,'say_bye'))

我认为 inspect 模块对您有很大帮助。 上述代码中使用的主要功能是 dir,eval,inspect.getargspec 。您可以在python docs中获得相关帮助。