【问题标题】:Python 3 - substituting functions for print()Python 3 - 用函数替换 print()
【发布时间】: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?
  • 每个模块都有自己的命名空间,用于查找变量名。因此文件中的变量printfile.py 中的变量不同。这样做是为了让模块作者不必担心他们的变量可能与调用者中的变量发生冲突。

标签: python python-3.x


【解决方案1】:

名称查找大致是所有模块共享的builtins,每个模块自己的global命名空间,然后是嵌套的函数/类命名空间。 print 函数位于 builtins 中,因此默认情况下在所有模块中可见。

minimal.py 中的赋值 print = printA 将新名称 print 添加到 minimal 的全局命名空间。这意味着minimal.print 阴影builtins.print minimal 模块内。该更改在任何其他模块中不可见,因为每个模块都有一个单独的模块全局命名空间。

要在所有模块中更改 print,请重新分配 builtins.print

import builtins

_real_print = builtins.print

def printA(*args, **kwargs):
    _real_print("A: ", end="")
    _real_print(*args, **kwargs)

builtins.print = printA

【讨论】:

  • 另一种可能性是做 file.print = printA.
猜你喜欢
  • 2019-07-21
  • 2013-04-17
  • 2013-02-25
  • 2016-07-09
  • 2017-03-19
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多