这两条Python语句的区别是什么?

这两条Python语句的区别是什么?,python,python-2.7,swig,Python,Python 2.7,Swig,我正在深入研究Python的代码,发现了几个类似这样的块: def wiringPiSetup(): return _wiringpi2.wiringPiSetup() wiringPiSetup = _wiringpi2.wiringPiSetup 这让我有点困惑,因为我认为: def wiringPiSetup(): return _wiringpi2.wiringPiSetup() 将产生与此完全相同的结果: wiringPiSetup = _wiringpi2.wiringP

我正在深入研究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
  • 这是我看到的文件:

此文件由生成。从读取(
emitFunctionShadowHelper
)可以看出,如果包装函数有一些docstring,代码生成器会创建一个包装函数,但如果函数没有任何docstring,则代码生成器会发出一个简单的assign语句。似乎可能会将“
else
”子句添加到该函数中。

该文件由生成。函数定义实际上是“死代码”,因为您可以完全删除函数定义,只需保留赋值即可

因为代码是自动生成的,所以代码有点低效。报告指出:

if(Getattr(n,“feature:python:callback”)| |!have_addtofunc(n)){
/*如果没有addtofunc指令,则只需从扩展模块分配(用于加速)*/
Printv(目标,名称,“=”,模块,“.”,名称,“\n”,无);
}
因此,第二个任务就是替换生成的Python函数以加快使用速度

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


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

Eh?好问题,我不知道他们为什么这么做。试着删除其中一个选项。我注意到的第一件事是“这个文件是自动生成的”,这也许可以解释这个看似毫无意义的陈述。我从来没有使用过SWIG,也不知道它为什么会生成这样的代码。如果后来出于某种原因,有人做了这样的事情:
\u wiringpi2.wiringPiSetup=newfunc
?如果调用函数版本的
wiringPiSetup
,可能会得到不同的结果。@acushner请记住,在Python中,赋值主要是更改事物的名称。第一个示例将
\u wiringpi2.wiringPiSetup
重命名为
newfunc
,并执行
newfunc
所做的任何操作。如果您仍然有一个名称引用了
wiringPiSetup
的原始定义,它将显示原始行为。回答这个问题时有3秒的差异。你们两个都做得很好!谢谢,看来这是对的。不管怎样,我想知道这是否是让死掉的代码出现在那里的唯一原因。@DWilches:看起来;它过去只是不生成函数。这是一个转换为Git的SVN提交,因此无法(轻松)检索原始分支和该分支的提交。