如何在给定的上下文(本地和全局)中执行可调用对象?

维克多·塞尔吉坚科

我有一个callback内部计算可赎回债券exec()

_globals_locals那名在此使用exec()还有一个关键的值variable_from_context_locals

但是,当我尝试调用时callback(),它是在当前上下文中执行的,而不是在其原始上下文中执行的。它找不到variable_from_context

exec()只接受一个str或一个代码对象。我找到了这种方法来访问callback的代码对象,并尝试调用此方法:

exec(callback.__code__, scenario._globals, scenario._locals)

但是我又得到了NameError: name 'variable_from_context' is not defined

callback给定的globals打电话的正确方法是什么locals

代码示例:

der_callback = None

def save_callback(cb):
    der_callback = cb

_locals = {}
_globals = {'save_callback': save_callback}

text = r'''
zoo = ['we']

def foo():
    print(zoo[0])

save_callback(foo)
'''

exec(text, _globals, _locals)
print(_locals)

# One can also try this:
# exec(_locals['foo'].__code__, _globals, _locals)

# EDIT: Now, why doesn't _locals get used when invoking a function?
# This works:
# exec('print(zoo[0])', _globals, _locals)

# EDIT continues: This doesn't:
# exec('foo()', _globals, _locals)

_locals['foo']()

输出:

Traceback (most recent call last):
{'zoo': ['we'], 'foo': <function foo at 0x1020b2d90>}
  File "/Users/me/pyzoo/callback_from_eval.py", line 22, in <module>
    exec(_locals['foo'].__code__, _globals, _locals)
  File "<string>", line 5, in foo
NameError: name 'zoo' is not defined
蚀刻

首先,任何上下文都有其全局变量和局部变量。在模块级别,它们是等效的(同一词典)。在其他情况下,它们通常有所不同。除非您将东西声明为global否则任何赋值都会修改上下文局部变量,而不是全局变量。

然后,任何功能都有其自己的本地变量。结果,当输入时foo_globals被视为全局变量,而_locals未被视为本地变量所以,zoo是不可见的。直接解决方法是global zoo在将其分配给块之前

同样,您在中也暴露了相同的问题save_callback:分配给der_callback不会更改全局变量,而是会导致局部变量退出后立即丢失。要修复,请der_callback在函数内部声明为全局。

UPD:如果您需要本地顶级本地人,可以尝试以下技巧之一:

T1。在块全局级别上,为locals()分配一个名称,并在foo()中重用它:

globals()['xl'] = locals()
zoo = ['we']

def foo():
    print(xl['zoo'][0])

T2。使用调用堆栈框架查找:

块外:

def save_callback(cb):
    global der_callback
    der_callback = lambda: cb(sys._getframe(1).f_locals)

在foo定义中:

def foo(xl):
    print(xl['zoo'][0])

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

如何在Java Servlet上下文中获取和设置全局对象

来自分类Dev

Javascript中的执行上下文和执行上下文对象

来自分类Java

如何在Spring中设置全局上下文变量?

来自分类Dev

JavaScript中的执行上下文和对象

来自分类Dev

如何在Django中对上下文对象执行分页?

来自分类Dev

如何在junit中编辑作业的执行上下文

来自分类Javascript

如何在调用函数中设置空上下文?

来自分类Dev

最初的全局执行上下文是否曾经在JavaScript中从调用堆栈中弹出?

来自分类Dev

如何在 kotlin 对象中定义上下文

来自分类Dev

如何在Javascript中获得对象的正确上下文

来自分类Dev

Django 模板 - 如何在给定索引号(由迭代器生成)的情况下访问表单(上下文)中的表单

来自分类Dev

如何使用 ToJSON 在给定模板文本和上下文的情况下呈现姜模板?

来自分类Dev

node-red 中的全局上下文来存储 http req 和 res 对象

来自分类Dev

如何在Java类中调用“公共字符串名称(上下文上下文)”

来自分类Dev

如何在Django中使全局上下文变量

来自分类Dev

全局上下文和Node.js中的“ this”

来自分类Dev

全局上下文和内部函数中的“ this”

来自分类Java

如何在Spring Boot + GraphQL Java Tools的上下文中执行对GraphQL的Java调用?

来自分类Dev

如何在调用位置而不是定义位置的上下文中执行方法?

来自分类Dev

如何在Django模板标签中设置全局可访问的上下文变量?

来自分类Dev

如何修复“ DATA”是一种类型,在给定的上下文中无效

来自分类Dev

“参数”是“类型”,在给定的上下文中无效

来自分类Dev

Django上下文处理器-'str'对象不可调用

来自分类Dev

如何在“上下文”和“ it”块内部和外部调用相同的方法

来自分类Dev

了解对象字面量中的执行上下文

来自分类Dev

如何从插件内部访问查询中给定的上下文?

来自分类Dev

JavaScript中的“调用上下文”和“执行上下文”:我们在谈论同一件事吗?

来自分类Dev

如何在`with`上下文管理器中模拟sqlalchemy执行输出

来自分类Dev

如何在VueJS上下文中的<img>标记中执行串联

Related 相关文章

  1. 1

    如何在Java Servlet上下文中获取和设置全局对象

  2. 2

    Javascript中的执行上下文和执行上下文对象

  3. 3

    如何在Spring中设置全局上下文变量?

  4. 4

    JavaScript中的执行上下文和对象

  5. 5

    如何在Django中对上下文对象执行分页?

  6. 6

    如何在junit中编辑作业的执行上下文

  7. 7

    如何在调用函数中设置空上下文?

  8. 8

    最初的全局执行上下文是否曾经在JavaScript中从调用堆栈中弹出?

  9. 9

    如何在 kotlin 对象中定义上下文

  10. 10

    如何在Javascript中获得对象的正确上下文

  11. 11

    Django 模板 - 如何在给定索引号(由迭代器生成)的情况下访问表单(上下文)中的表单

  12. 12

    如何使用 ToJSON 在给定模板文本和上下文的情况下呈现姜模板?

  13. 13

    node-red 中的全局上下文来存储 http req 和 res 对象

  14. 14

    如何在Java类中调用“公共字符串名称(上下文上下文)”

  15. 15

    如何在Django中使全局上下文变量

  16. 16

    全局上下文和Node.js中的“ this”

  17. 17

    全局上下文和内部函数中的“ this”

  18. 18

    如何在Spring Boot + GraphQL Java Tools的上下文中执行对GraphQL的Java调用?

  19. 19

    如何在调用位置而不是定义位置的上下文中执行方法?

  20. 20

    如何在Django模板标签中设置全局可访问的上下文变量?

  21. 21

    如何修复“ DATA”是一种类型,在给定的上下文中无效

  22. 22

    “参数”是“类型”,在给定的上下文中无效

  23. 23

    Django上下文处理器-'str'对象不可调用

  24. 24

    如何在“上下文”和“ it”块内部和外部调用相同的方法

  25. 25

    了解对象字面量中的执行上下文

  26. 26

    如何从插件内部访问查询中给定的上下文?

  27. 27

    JavaScript中的“调用上下文”和“执行上下文”:我们在谈论同一件事吗?

  28. 28

    如何在`with`上下文管理器中模拟sqlalchemy执行输出

  29. 29

    如何在VueJS上下文中的<img>标记中执行串联

热门标签

归档