python:从__future__导入print_function必须在每个加载的模块中吗?

bvz*_*bvz 1 python python-3.7

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

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

我通过捕获importerror然后加载2.7版本来处理configparser问题。

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

from __future__ import print_function
Run Code Online (Sandbox Code Playgroud)

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

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

import sys

def print_error():
    print("AND THIS IS?", file=sys.stderr)
Run Code Online (Sandbox Code Playgroud)

这是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
Run Code Online (Sandbox Code Playgroud)

运行此代码时,得到以下输出:

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 
Run Code Online (Sandbox Code Playgroud)

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

难道我做错了什么?还是我需要在每个模块中都包含此行。如果是这样,我该如何与从python 3.7(我不想在其中加载print函数的地方from __future__)调用这些库的时代协调起来?

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

感谢您提供的所有帮助!

lmi*_*asf 5

在Python 3中,它print一个函数,在Python 2中,它是一个关键字,因此基本上在Python 2中,它不需要参数file

您将必须from __future__ import print_function在每个模块的顶部添加,以禁用该语句并使用该print()功能,请在模块顶部使用此future语句。

从docs中,有__future__3个目的:

  1. 避免混淆用于分析导入语句并查找它们要导入的模块的现有工具。

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

  3. 记录何时引入了不兼容的更改,以及何时(或将要)将它们强制执行。

  • 并且由于`print`是语句而非函数,因此逗号定义了一个元组,而不是参数列表,并且元组文字不能包含像`file = sys.stderr`这样的键值对。Python 2以与t =(“ ...”,file = sys.stderr)相同的方式解释该语句。打印t`。 (2认同)