在类定义级别的lambda中的Python self,Eclipse咆哮,但解释器工作,这是标准化的吗?

时间:2012-11-14 13:00:38

标签: python eclipse lambda pydev

我有以下代码(缩写为只留下要点):

class Strange():
    def setter(self, val):
         self._val = val

    val = property(lambda: self._val, setter)
Eclipse中的PyDev Helios强调自我是不可见的,我认为这应该是真实的,并且与Python的显式哲学一致。但是代码在ipython 2.7中运行良好,并且在代码库中使用。

这是一个安全漏洞,一个词汇范围的怪癖吗?或者是否有一个PEP或文档解释这个,它只是PyDev错过了什么?

编辑: 回答评论:它适用于我的机器,也许你的Python和OS版本不同。但是,谢谢,这在某种程度上回答了我关于它不是标准行为的问题。

以下是我的控制台输出:

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定义时运行了......如果有人已经在定义中得到错误,请在评论中告诉我。

1 个答案:

答案 0 :(得分:3)

您的代码不正确。

它解析,您可以实例化该类 - 您甚至可以设置val,但如果您尝试从那里访问TypeError,您将获得val

实际上,您的代码中还有另一个错误:您没有从object继承 - 这样做 你的类在Python 2中是一个"old style class",属性根本不适合它们。

在我们的代码段中归因和获取val的值不会显示明显的错误,因为在归因时将完全绕过setter。

那里唯一缺少的是lambda表达式本身的self参数(当然,还有它作为一个新的样式类):

class Strange(object):
    def setter(self, val):
         self._val = val

    val = property(lambda self: self._val, setter)