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

时间:2014-04-25 15:00:23

标签: python python-2.7 swig

我在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在其中任何一个都足够的时候就放了?

顺便说一句:

  • 我使用的是Python 2.7.3
  • 这是我看到的文件:here

2 个答案:

答案 0 :(得分:3)

该文件由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()为真),则不会生成替换行。

假设原始功能保留在原位,以便自动完成工具可以使用功能签名。

答案 1 :(得分:1)

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