print(“hello world”,end ='')会导致语法错误

时间:2014-09-26 19:31:33

标签: python

我创建了一个我在另一个程序中使用的模块。 模块打印一些文本,睡眠一秒钟,然后打印更多文本(在同一行,没有任何空格)。 我正在运行python 2.7,而from __future__ import print_function是程序中调用模块的第一行,但是当我导入模块时,我收到此错误:

Traceback (most recent call last):
  File "C:\######\document.py", line 3
1, in <module>
    import mymodule
  File "C:\######\document.py", line 2
    print("hello world", end=' ')
                          ^
SyntaxError: invalid syntax

这是代码:

def run():
    print("hello world", end =' ')
    time.sleep(0.5)
    print(".", end =' ')
    time.sleep(0.5)
    print(".", end =' ')
    time.sleep(0.5)
    print(".")
    time.sleep(0.25)

如何在不导入print_function两次的情况下解决此问题?

1 个答案:

答案 0 :(得分:7)

  

我正在运行python 2.7,并在调用我的模块的程序中导入了print_function

这不起作用。您必须在此模块中执行将来的语句,而不是在导入它的脚本或模块中。

有关详细信息,请参阅the documentation。但是简短的版本是:future语句改变了模块编译的方式,因此Python必须能够在模块编译时看到它,而不仅仅是在运行时。 (这也是为什么它必须是文件中的第一个非注释/文档字符串行。)


好的,这样就解释了如何修复它,但它没有解释为什么会出现问题,除非你已经知道模块编译何时发生。

过度简化:当您import spam时(如果在此会话期间尚未导入),Python会寻找合适的spam.py文件。如果找到一个,则会查找比spam.pyc更新的spam.py。如果是这样,它只是执行它。如果没有,它会将spam.py编译为spam.pyc,然后执行它。

因此,由于未来的语句会影响代码的编译方式,如果Python希望让您的未来语句影响您导入的其他模块,则必须为每个可能的未来组合存储不同版本的spam.pyc陈述 - 可能是spam.pycspam+print_function.pycspam+division.pycspam+print_function+division.pyc等。


最后:

  

如何在不导入print_function两次的情况下解决此问题?

你真的不能。好吧,你可以,但你不想这样做。我能想象到的最简洁和最简单的方法是编写一个import hook来覆盖查找和编译.pyc文件的常用机制,以确保将import的所有内容视为一样将所有未来的陈述都应用(可能使用上面提到的spam+print_function.pyc技巧,以确保您不会与普通的缓存.pyc文件冲突。(参见{{3有关让模块继承未来标志或明确指定一组标志的信息的文档。)

如果这听起来真的很酷,那么了解Python的导入系统会很有趣,但我强烈建议等到你之前升级到至少Python 3.4,因为它已经改变了很多,并且为了更好;它更容易学习(特别是因为整个事情都是用Python编写的,并且完整记录,而不是散布在三个不同地方的C代码),而且更灵活(所以你通常不需要复制一半) Python通常为您做什么,您可以只替换您想要更改的那个部分。