2012-05-10 13 views
3

reprがスクリーンに表示されているときに、表現されたPythonオブジェクトのテキストからオブジェクトを作成できますか?テキスト表現からのPythonオブジェクトの再構築

>>> select.select([s], [],[]) 
([<socket._socketobject object at 0x7f274914c600>], [], []) 
>>> eval('<socket._socketobject object at 0x7f274914c600>') # Fail 

また、オブジェクトがstdoutに表示されたら、GCdを取得しますか?

Python CLIで遊んでいるときは、あまり役に立ちませんが、時には役立つことがあります。

答えて

2

reprの出力はオブジェクトを再構成することができますが、角括弧で囲まれたビットがある場合、それらのビットは再構成できません。

この場合、ソケットを再構築することはできません。はい、すぐにガベージコレクションされます。

+0

私は多分、私はSOの専門家に尋ねると思っていたと思っています:) – tMC

1

明らかにテキストプレゼンテーションがオブジェクトのすべての情報を含むとは限りません。

テキスト表現のオブジェクト表現をしたい場合は、JSONモジュールを試してみてください。

http://docs.python.org/library/json.html?highlight=json#json

はまた、このプレゼンテーションでカプセル化されたオブジェクトは、などのソケット、ファイルハンドル、同じよう

+0

もし私がシリアル化しようとしていたら、私は反対です。しかし、cliで出力をキャプチャしなければ、私は事実の後にできるかどうか疑問に思っていた。 (オブジェクトがまだ存在する場合は、それを再構成するのに十分なメモリアドレスです) – tMC

1

あなたはreprは、作成することを可能にするためのオブジェクトを作成することが奨励され、ネイティブオブジェクトのバインディングを持つことができませんのでご了承くださいrepr出力を貼り付けて新しいオブジェクトを作成しますが、厳密には適用されません。オブジェクトや内部構造の性質によっては、これも簡単ではないかもしれません。

これにはさまざまな方法があります。ここでは一つの方法は非常に簡単な例です:

>>> r = ReprObject(value=1, item=True) 
>>> r 
ReprObject(**{'item': True, 'value': 1}) 

reprとすると、作成するためにそれを使用することをコピー/ペースト:

class ReprObject(object): 
    def __init__(self, value, item): 
     self.value = value 
     self.item = item 

    def __repr__(self): 
     return '%s(**%r)' % (self.__class__.__name__, self.__dict__) 

だから、我々は対話インタプリタに、インスタンスを作成しますが、ことを取ります新しいオブジェクト:

>>> r2 = ReprObject(**{'item': True, 'value': 1}) 
>>> r2 
ReprObject(**{'item': True, 'value': 1}) 

そしてeval()でも動作します:

>>> eval(repr(r2)) 
ReprObject(**{'item': True, 'value': 1})