1

私は次のコードを持っています(要点だけを残すために短縮されています):

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 と 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)

定義の実行時にラムダの内容が実行されることを期待してStrangeいます...誰かがすでに定義でエラーを受け取っている場合は、コメントでお知らせください。

4

1 に答える 1

3

コードが正しくありません。

解析し、クラスをインスタンス化できます-さらに設定することもできますが、そこからアクセスしようとするvalと を取得します。TypeErrorval

実際、あなたのコードには別のエラーがあります: you don't inherit from object- これにより、クラスは Python 2 の「古いスタイルのクラス」になり、プロパティは単純にそれらで機能しません。

属性を設定する際にセッターが完全にバイパスされるため、スニペットから属性を設定して値を取得してvalも、明らかなエラーは表示されません。

そこに欠けているのはself、ラムダ式自体のパラメーターだけです (そして、もちろん、新しいスタイル クラスとして持っています)。

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

    val = property(lambda self: self._val, setter)
于 2012-11-15T12:53:00.660 に答える