首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python self in lambda在类定义级别,Eclipse会叫,但解释器可以工作,这是标准化的吗?

Python self in lambda在类定义级别,Eclipse会叫,但解释器可以工作,这是标准化的吗?
EN

Stack Overflow用户
提问于 2012-11-14 21:00:38
回答 1查看 275关注 0票数 1

我有以下代码(简化为只保留必要部分):

代码语言:javascript
运行
复制
class Strange():
    def setter(self, val):
         self._val = val

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

Eclipse Helios中的PyDev认为self是不可见的,我认为这应该是正确的,并与Python的明确哲学相一致。但是,代码在IPython2.7中运行良好,并在代码库中使用。

这是一个安全漏洞,还是词法作用域的怪癖?或者是有一个PEP或文档来解释这一点,而它只是PyDev遗漏了什么?

编辑:回答评论:它在我的机器上工作,可能你的Python版本和操作系统不同。但谢谢,这以某种方式回答了我关于这不是标准行为的问题。

在我的例子中,控制台输出如下:

代码语言:javascript
运行
复制
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:好的,正如Martijn建议的那样,我在调用Strange().val时得到了一个错误。但奇怪的是,它是一个运行时错误,而不是字节码编译错误:

代码语言:javascript
运行
复制
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定义时运行了……如果有人已经在定义上得到了错误,请在评论中告诉我。

EN

回答 1

Stack Overflow用户

发布于 2012-11-15 20:53:01

您的代码不正确。

它会进行解析,您可以实例化该类-甚至可以设置val,但是如果您尝试从那里访问val,则会得到一个TypeError

实际上,您的代码中还有另一个错误:您没有从object继承-这使得您的类成为Python2中的"old style class",并且属性根本不能与它们一起工作。

在我们的代码片段上从val获取属性和值不会显示一个明显的错误,因为在进行属性设置时将完全绕过setter。

不过,这里唯一缺少的是lambda表达式本身的self参数(当然,将其作为一个新的样式类):

代码语言:javascript
运行
复制
class Strange(object):
    def setter(self, val):
         self._val = val

    val = property(lambda self: self._val, setter)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13379314

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档