<p>使用<a href="https://docs.python.org/2/library/functions.html#id" rel="nofollow">^{<cd1>}</a>函数检查对象标识:</p>
<pre><code>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
</code></pre>
<p>请注意,使用<code>fn.__name__</code>可能是可接受的,也可能是不可接受的,这取决于您的特定系统(在某些系统中,这将被视为安全风险):</p>
<pre><code>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
</code></pre>
<p>如果必须依赖名称而不是id(例如,如果将函数传递给子进程或远程进程),则至少使用<a href="https://docs.python.org/2.7/reference/datamodel.html#index-59" rel="nofollow">read-only code object</a>中的安全路径:</p>
<pre><code># the unforgeable name, similar to a fingerprint
print foo.__code__.co_name == sybil.__code__.co_name
#=> False
</code></pre>
<p>如果您想知道恶意函数的花哨名称,请查看维基百科的<a href="http://en.wikipedia.org/wiki/Alice_and_Bob#Cast_of_characters" rel="nofollow">Alice and Bob</a>。你知道吗</p>