这两个Python语句有什么区别?

2024-06-16 14:18:15 发布

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

我正在深入研究Python的WiringPi-Python代码,发现了几个类似这样的块:

def wiringPiSetup():
  return _wiringpi2.wiringPiSetup()
wiringPiSetup = _wiringpi2.wiringPiSetup

这让我有点困惑,因为我认为:

def wiringPiSetup():
  return _wiringpi2.wiringPiSetup()

会产生与此完全相同的结果:

wiringPiSetup = _wiringpi2.wiringPiSetup

我知道第一个是声明一个新函数,第二个是对原始函数的引用,但是在我所做的测试中,我发现它们是完全等价的。看这里:

>>> def a():
...     return 4
... 
>>> def a1():
...     return a()
... 
>>> a2 = a
>>> 
>>> a1()
4
>>> a2()
4

那么,为什么WiringPi Python在它们中的任何一个都可以满足的情况下同时使用这两个呢?你知道吗

顺便说一句:

  • 我正在使用python2.7.3
  • 这是我看到的文件:here

Tags: 文件函数代码声明a2returnheredef
2条回答

文件由SWIG生成。函数定义确实是“死代码”,因为您可以完全删除函数定义,只需保留赋值即可。你知道吗

因为代码是自动生成的,所以代码有点低效。SWIG function that generates this code表示:

if (Getattr(n, "feature:python:callback") || !have_addtofunc(n)) {
  /* If there is no addtofunc directive then just assign from the extension module (for speed up) */
  Printv(f_dest, name, " = ", module, ".", name, "\n", NIL);
}

因此,第二个赋值就是替换生成的Python函数以加快使用速度。你知道吗

如果函数在生成时要添加其他Python代码(have_addtofunc()在有docstring、prepend或append值时为true),则不会生成替换行。你知道吗

假设原始函数保留在原位,以便自动完成工具可以使用函数签名。你知道吗

此文件由SWIG生成。从读取SWIG Python generator soure codeemitFunctionShadowHelper)可以看出,如果包装函数有一些docstring,那么代码生成器会创建一个包装函数,但是如果该函数没有任何docstring,那么代码生成器会发出一个简单的assign语句。似乎可以向该函数添加“else”子句。你知道吗

相关问题 更多 >