V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
AndyAO
V2EX  ›  问与答

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

  •  2
     
  •   AndyAO · 2021-03-23 08:20:23 +08:00 · 683 次点击
    这是一个创建于 1101 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想在 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())
    
    第 1 条附言  ·  2021-03-23 16:06:05 +08:00
    我的问题已经得到了解决,目前看来,Python 没有这样的机制,另外如果要使用表达式来定义默认参数,那么很可能会出现令人意想不到的现象,从这里可以察觉出 Python 函数的某种本质,下面这个高票答案很好的讲述了这个问题,很值得去看。

    [“Least Astonishment” and the Mutable Default Argument]( https://stackoverflow.com/a/1145781)
    2 条回复    2021-03-23 14:26:33 +08:00
    ebingtel
        1
    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
        2
    wangaroo  
       2021-03-23 14:26:33 +08:00
    global 关键字?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1546 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:15 · PVG 01:15 · LAX 10:15 · JFK 13:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.