高阶函数IF ELSE ch

2024-06-28 11:21:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带两个函数的导入模块

def kind1(paramA, paramB)
    ...

def kind2(paramA, paramB)

我随机将这两个函数中的一个通过构造函数传递给对象。你知道吗

object = Constructor(param1, param2, function)

现在与

>>> print object.function

我明白了

function kind1 at 0xb124...

或者

function kind2 at 0xb1464...

我怎样才能确认对象.函数是第1类还是第2类?你知道吗

我试过了

if object.function == kind1:
    print 'kind1'
elif object.function == kind2:
    print 'kind2'

if object.function == kind1():
    print 'kind1'
elif object.function == kind2():
    print 'kind2'

我也试过了

if isinstance(object.function, kind1):
    print 'kind1'
elif isinstance(object.function, kind2):
    print 'kind2'

但他们显然不起作用。 做这个检查的正确方法是什么?你知道吗


Tags: 模块对象函数ifobjectdeffunctionat
3条回答

使用^{}函数检查对象标识:

def foo():
    pass
def bar():
    pass
def whatisit(fn):
    case = {
       id(foo) : "foo",
       id(bar) : "bar",
    }
    print "got function %s" % case[id(fn)]
# see what we get     
whatisit(foo)
whatisit(bar)
=>
got function foo
got function bar

请注意,使用fn.__name__可能是可接受的,也可能是不可接受的,这取决于您的特定系统(在某些系统中,这将被视为安全风险):

def foo():
    pass
def sybil():
    pass
# let's be evil
sybil.__name__ = 'foo'
# social engineering ;-)
print foo.__name__ == sybil.__name__
#=> True
# always check identity
print id(foo) == id(sybil)
#=> False

如果必须依赖名称而不是id(例如,如果将函数传递给子进程或远程进程),则至少使用read-only code object中的安全路径:

# the unforgeable name, similar to a fingerprint
print foo.__code__.co_name == sybil.__code__.co_name
#=> False

如果您想知道恶意函数的花哨名称,请查看维基百科的Alice and Bob。你知道吗

您的代码示例与所描述的行为不匹配,将函数对象指定给属性不会更改该对象的标识:

def foo():
    pass

class Klass(object):
    def __init__(self, f):
        self.f = f

a = Klass(foo)
print(a.f is foo)  # True
print(a.f == foo)  # True

我认为您需要将函数(方法)称为ObjectInstance.kind1ClassOfObject.kind1

type(ClassOfObject.kind1) == <class 'function'>type(ObjectInstance.kind1) == <class 'method'>并且有不同的地址很难直接比较,一个解决方法是使用一些属性来比较它(比如.__name__或者创建自己的属性)

相关问题 更多 >