我有以下代码(缩短为只留下必需品):
class Strange():
def setter(self, val):
self._val = val
val = property(lambda: self._val, setter)
Eclipse Helios 中的 PyDev 声称 self 是不可见的,我认为这应该是正确的,并且与 Python 的明确哲学一致。然而,代码在 ipython 2.7 中运行良好,并在代码库中使用。
这是一个安全漏洞,一个词汇范围的怪癖吗?或者是否有解释这一点的 PEP 或文档,它只是 PyDev 遗漏了什么?
编辑:回答评论:它适用于我的机器,也许你的 Python 和操作系统版本不同。但是,谢谢,这以某种方式回答了我关于它不是标准行为的问题。
这是我的控制台输出:
barszcz:~ $ uname -a
Linux barszcz 3.4.9-1-ARCH #1 SMP PREEMPT Wed Aug 15 18:59:31 CEST 2012 x86_64 GNU/Linux
barszcz:~ $ ipython2
Python 2.7.3 (default, Apr 24 2012, 00:00:54)
Type "copyright", "credits" or "license" for more information.
IPython 0.13 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: %cpaste
Pasting code; enter '--' alone on the line to stop or use Ctrl-D.
:class Strange():
: def setter(self, val):
: self._val = val
:
: val = property(lambda: self._val, setter)
:
:<EOF>
In [2]: Strange
Out[2]: __main__.Strange
In [3]: Strange()
Out[3]: <__main__.Strange instance at 0x26425f0>
EDIT2:好的,所以我在调用时遇到错误Strange().val
,就像 Martijn 建议的那样。但奇怪的是它是运行时错误而不是字节码编译错误:
In [4]: Strange().val
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-88f3db8b81d0> in <module>()
----> 1 Strange().val
TypeError: <lambda>() takes no arguments (1 given)
我希望 lambda 的内容已经在执行Strange
定义时运行...如果有人已经收到定义错误,请在评论中告诉我。