【问题标题】:python: from __future__ import print_function must be in every loaded module?python: from __future__ import print_function 必须在每个加载的模块中?
【发布时间】:2019-08-25 17:13:34
【问题描述】:

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

我在 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 python-3.7


    【解决方案1】:

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

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

    From the docs__future__ 有 3 个用途:

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

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

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

    【讨论】:

    • 并且因为print是一个语句,而不是一个函数,所以逗号定义了一个元组,而不是一个参数列表,并且元组文字不能包含像file=sys.stderr这样的键值对。 Python 2 以与 t=("...", file=sys.stderr); print t 相同的方式解释该语句。
    • @chepner,没错!
    • 我接受这个作为答案,因为它清楚地解释了我需要做什么(包括每个模块顶部的声明)。但是我仍然不确定为什么将它包含在正在运行的第一个模块的顶部是不够的。显然,它与 python 解释器在加载模块时的工作方式有关。无论如何,我现在知道我需要做什么。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-11-09
    • 2017-04-11
    • 2020-11-10
    • 2012-11-07
    • 2020-09-06
    • 2022-11-11
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多