【发布时间】:2021-01-20 19:46:44
【问题描述】:
我正在尝试为print() 函数编写一个替换;我想了解 Python 3 在这里做了什么。
考虑以下两个 Python 3 源文件:
文件.py:
def in_a_file():
print("this is in a file")
minimal.py:
import builtins
from file import *
def test():
print("this is a test")
def printA(*args, **kwargs):
builtins.print("A: ", end="")
builtins.print(*args, **kwargs)
print = printA
test()
in_a_file()
当我运行 minimum.py 时,我得到以下输出:
A: this is a test
this is in a file
因此,很明显,赋值 print=printA 改变了 print() 在函数 test() 中的行为,但在函数 file() 中没有。
为什么?
还有,我可以在 minimum.py 中放入类似地改变 print() 在函数 file() 中的行为的代码吗?
【问题讨论】:
-
一个模块有自己的命名空间,它不使用导入它的文件中定义的变量。
-
@Barmar 我想你是对的,但你能详细说明一下吗?我不明白“它不使用导入它的文件中定义的变量”如何解释我所看到的。或者如何获得我想要的行为——即改变模块中 print() 的工作方式。
-
这能回答你的问题吗? Python3 global scoping in different modules
-
这能回答你的问题吗? Short description of the scoping rules?
-
每个模块都有自己的命名空间,用于查找变量名。因此文件中的变量
print与file.py中的变量不同。这样做是为了让模块作者不必担心他们的变量可能与调用者中的变量发生冲突。
标签: python python-3.x