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),你只会得到一个check_foo.Foo模块。

我知道 PEP 343 提到您可以执行以下操作:

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

check_foo并且它会在as中正确实例化,check_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]

我怀疑这是一个完整的解决方案,但它确实允许您将值的一个绑定更改为名称。它更改绑定到最接近调用的值的名称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 回答