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

问题描述 投票:1回答:1

我不是一个专业的程序员,所以我的知识有一些大漏洞(只是一个抬头)。

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

我通过捕获importerror然后加载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 python-3.7
1个回答
5
投票

在Python 3中,printa function,而在Python 2中它是keyword,因此基本上在Python 2中,它不期望参数file

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

From the docs__future__有3个目的:

  1. 避免混淆分析import语句的现有工具,并找到他们导入的模块。
  2. 确保将来的语句在2.1之前的版本下运行,至少产生运行时异常。
  3. 引入不兼容的更改时的文档,以及它们何时 - 或者 - 是强制性的。
© www.soinside.com 2019 - 2024. All rights reserved.