描述当前范围的对象

时间:2015-07-27 16:42:32

标签: python scope getattr

我使用的API定义了这样的方法:

def show_prop(object, propname): #...

它应该做的是通过调用getattr(object, propname)在屏幕上显示该属性,并允许用户更改属性,从而产生setattr(object, propname)

我无法改变这种行为但是我想使用API​​向用户显示本地变量并从用户那里收到正常反馈?

我想到了一个描述当前范围和可用变量的构建变量,有点像本地__dict__,但我还没有找到这样的东西。

userinput = "Default input"
show_prop(__mysterious_unknown__, 'userinput')
# Do something exciting with the changed userinput

这可能实现吗?

1 个答案:

答案 0 :(得分:1)

没有。本地写入访问只能使用nonlocal(仅限Python3)直接在作用域或嵌套作用域中完成。

Python没有“指针”的概念,指定可写位置的唯一方法是传递对容器的引用和成员的“名称”(或者数组的索引,键的关键)字典)。

然而,你可以做的就是为此动态创建一个小物体:

class Bunch:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

def foo():
    my_local = 42
    ...
    myobj = Bunch(my_local=my_local) # create the dummy instance
    show_prop(myobj, "my_local")     # call the original code
    my_local = myobj.my_local        # get modified value back
    ...

在Python3中可以创建一个魔术对象实例,当写入成员时会动态改变本地(使用新的Python3 nonlocal关键字和属性或__getattr__ / __setattr__全能)。除非真的需要,否则我不会去寻找这种奇怪的魔法......

例如:

def foo(obj, name):
    # the fixed API
    setattr(obj, name, 1 + getattr(obj, name))

def bar():
    myloc = 11

    # magic class...
    class MyClass:
        def __getattr__(self, name):
            # accessing any member returns the current value of the local
            return myloc
        def __setattr__(self, name, value):
            # writing any member will mutate the local (requires Python3)
            nonlocal myloc
            myloc = value

    foo(MyClass(), "myloc")
    print(myloc) # here myloc will have been incremented

bar()