python: from __future__ import print_function 必须在每个加载的模块中?

标签 python python-3.7

我不是专业程序员,所以我的知识有很多漏洞(请注意)。

我在 python 3.7 中编写了一些库。但现在我想从使用 python 2.7 的 3D 应用程序访问它们。他们拥有的唯一真正的 3.7 特定功能(据我目前所知)是 configparser(相对于 ConfigParser)和打印功能。

我通过捕获导入错误然后加载 2.7 版本来处理 configparser 问题。

我试图通过将此行添加到我在 3D 应用程序中运行的脚本的顶部来处理打印功能:

from __future__ import print_function

但是,当我导入一个包含 python 3 样式打印函数的模块时,出现语法错误。但是,如果我在加载的模块中包含 from __future__ 语句,一切正常。显然,我在这里遇到了我的知识限制。

这是我正在导入的模块的完整代码(称为 test.py):

import sys

def print_error():
    print("AND THIS IS?", file=sys.stderr)

下面是调用此代码的 3D 应用程序(运行 python 2.7)中的代码:

from __future__ import print_function
import sys
sys.path.append("/home/me/Documents/dev/")
print("WHY IS THIS NOT A SYNTAX ERROR?", file=sys.stderr)
from mylib import test

当我运行这段代码时,我得到以下输出:

WHY IS THIS NOT A SYNTAX ERROR?
00:00:08    Traceback (most recent call last):
00:00:08      File "<string>", line 7, in <module>
00:00:08      File "/home/me/Documents/dev/mylib/test.py", line 4
00:00:08        print("AND THIS IS?", file=sys.stderr)
00:00:08                                  ^
00:00:08    SyntaxError: invalid syntax
00:00:08 

但是如果我将 from __future__ 行放在 test.py 模块中,一切都会正确运行。

我做错了什么吗?或者我是否需要在每个模块中都有这一行。如果是这样,我如何协调它与我将从 python 3.7 调用这些库的时间(我不想在其中加载打印函数 from __future__)?

根据我的研究,似乎 from __future__ 是一个编译器指令,它控制脚本在运行时的编译方式?或许?我在这方面不知所措。但这是否意味着每次加载模块时都必须提醒编译器使用 from __future__

感谢所有帮助!

最佳答案

在 Python 3 中,printa function , 在 Python 2 中它是一个 keyword ,所以基本上在 Python 2 中,它不需要参数 file

您必须在每个模块的顶部添加 from __future__ import print_function,以禁用该语句并使用 print() 函数,在以下位置使用此 future 语句模块的顶部。

From the docs , __future__ 有 3 个目的:

  1. 避免混淆分析导入语句和查找它们正在导入的模块的现有工具。

  2. 确保 future 的语句在 2.1 之前的版本下运行至少会产生运行时异常。

  3. 记录何时引入了不兼容的更改,以及何时将(或曾经)强制执行这些更改。

关于python: from __future__ import print_function 必须在每个加载的模块中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55507609/

相关文章:

python - Pyautogui 在 IDLE 中工作,但当我将其作为 .py 执行时则不起作用

python - 根据Python中的多个条件将多个数据帧中的一列合并到另一个数据帧

javascript - 实现正则表达式以在 javascript 文件中查找带有类的 span

python - Pandas 在数据帧的每一列的第一个有效索引之前和最后一个有效索引之后放置

bash - 为什么/usr/local/bin/python3 的链接与 "which python3"的路径不同?

python - 在python中重命名多个文件

python - 如何删除 Python 3 中整数变量和字符串之间的空格?

python - 仅位置参数与 python 3.7 的兼容性

python-3.x - 如何优化以下代码,使其运行速度更快?

docker - 有没有办法使用 conda 或通过 tar 文件安装 Boto3?