描述当前作用域的对象
An object that describes the current scope
我使用的 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
这有可能实现吗?
没有。本地写访问只能直接在范围内或使用 nonlocal
(仅限 Python3)的嵌套范围内完成。
Python 没有 "pointer" 的概念,指定可写位置的唯一方法是传递对容器的引用和成员的 "name"(或数组的索引,字典的键)。
不过,您可以为此动态创建一个小对象:
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()
我使用的 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
这有可能实现吗?
没有。本地写访问只能直接在范围内或使用 nonlocal
(仅限 Python3)的嵌套范围内完成。
Python 没有 "pointer" 的概念,指定可写位置的唯一方法是传递对容器的引用和成员的 "name"(或数组的索引,字典的键)。
不过,您可以为此动态创建一个小对象:
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()