如何为 Python 的函数参数设置调用者上下文的表达式默认值?

2021-03-23 08:20:23 +08:00
 AndyAO

想在 Python 3 上封装个将文件作为代码动态执行的函数,exec的参数globals,locals 的默认值分别是当前上下文globals()locals(),自己封装的函数如何实现这种效果?

  1. 已经尝试过 def file(filepath,globals=globals(),locals=locals()) 没有效果。
  2. 查看exec的实现,发现被定义在def exec(__object: Union[str, bytes, CodeType], __globals: Optional[Dict[str, Any]] = ..., __locals: Optional[Mapping[str, Any]] = ...) -> Any: ...,直接使用这个参数列表会导致语法错误。

目前的函数是这样定义的

def file(filepath,globals,locals):
    with open(filepath, 'r', encoding='utf8') as textFileObj:
        return exec(compile(textFileObj.read(), filepath, 'exec'),globals,locals)

调用的时候只能这样手动传入,虽然可以通过片段等方法简化这个过程,实现类似的效果,但总归是默认值更方便。

Exe.file(Path.here(__file__,'HelloWorld.py'),globals(),locals())
709 次点击
所在节点    问与答
2 条回复
ebingtel
2021-03-23 09:33:30 +08:00
这样?

a.py:

import inspect


def f():
print(inspect.currentframe().f_back.f_globals)


调用:

>>> b = 1
>>> m = __import__('a')
>>> m.f()
{'b': 1, '__builtins__': <module '__builtin__' (built-in)>, 'm': <module 'a' from 'a.py'>, '__package__': None, '__name__': '__main__', '__doc__': None}
wangaroo
2021-03-23 14:26:33 +08:00
global 关键字?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/764113

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX