0

次のクラスがある場合:

class Foo(object):

    def __init__(name):
        self.name = name

そして、check_foo.pyというファイルでこのように使用します

with Foo("naming it"):
    print Foo.name


with Foo("naming another"):
    print Foo.name

インポートcheck_fooして実行すると、モジュールdir(check_foo)は1つだけになります。check_foo.Foo

PEP 343には、次のようなことができると記載されていることを知っています。

with Foo("naming it") as naming_it:
    print naming_it.name

そして、それはで適切にインスタンス化されますcheck_foocheck_foo.naming_it、私の質問は、これを回避して名前を動的に設定することが可能であるということです。

私は概念実証で遊んでいて、上記のアイデアでどこまで到達できるか知りたいです。

渡した文字列を使用してインスタンスに名前を付けることは可能Fooでしょうか?

注:私も知っていwithhacksます。私がそれを見てみることを提案しないでください:)

4

1 に答える 1

1

これがあなたが探している種類のハッカーかどうかはわかりません...

import inspect

class renameable(object):
  def rename_me(self, new_name):
    for stack_frame in inspect.stack()[1:]:
      frame_object = stack_frame[0] # frame is the first object in the tuple
      for (name, value) in frame_object.f_locals.iteritems():
        if value is self:
          old_name = name
          matched_frame = frame_object
          break
      if matched_frame:
        break
    if matched_frame:
      matched_frame.f_locals[new_name] = matched_frame.f_locals[old_name]
      del matched_frame.f_locals[old_name]

これが完全な解決策であるとは思えませんが、値の1つのバインディングを名前に変更することはできます。の呼び出しに最も近い値にバインドされている名前を変更しますrename_me。例えば:

>>> import blah
>>> x = blah.renameable()
>>> x
<blah.renameable object at 0x1004cb790>
>>> x.rename_me('y')
>>> x
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> y
<blah.renameable object at 0x1004cb790>
>>>

これが使用するよりも良いか悪いかwithhacksはわかりませんが、ライブラリ内でめったに探索されないモジュールを掘り下げます。

于 2011-02-18T02:23:38.377 に答える