描述当前scop的对象

2024-10-01 15:44:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的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

这有可能实现吗?你知道吗


Tags: 方法用户api属性定义object屏幕def
1条回答
网友
1楼 · 发布于 2024-10-01 15:44:50

不可以。只能直接在作用域中或使用nonlocal(仅Python3)在嵌套作用域中进行本地写访问。你知道吗

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

不过,您可以在飞行中创建一个小对象,仅此而已:

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中,可以创建一个magic对象实例,当写入成员时,该实例将动态地改变本地对象(使用新的Python3nonlocal关键字和一个属性或__getattr__/__setattr__catch all)。我不喜欢这种奇怪的魔法,除非真的需要。。。你知道吗

例如:

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

相关问题 更多 >

    热门问题