我的2.7.5版本__future__.print_function
不允许使用new
参数:
>>> print('hi', end='')
Parsing error SyntaxError: invalid syntax (line 1)
如果我无法弄明白的话,我会问一下为什么这是一个单独的帖子。现在,我想看看我的环境版本的这个函数有哪些参数可用。
我查看了this SO post和一些相关内容,但是当我尝试时这些似乎不起作用:
>>> print.func_code.co_varnames
Parsing error SyntaxError: invalid syntax (line 1)
>>> print_function.func_code.co_varnames
Runtime error
Traceback (most recent call last):
File "<string>", line 1, in <module>
AttributeError: _Feature instance has no attribute 'func_code'
我猜测__future__
函数的特殊性质是这种标准技术失败的原因。
还有另一种方法可以检查我的__future__.print_function
版本的args吗?
答案 0 :(得分:3)
您正在尝试将内置函数(在C中实现)视为用户定义的函数。它们不是同一件事。 .func_code
仅为用户定义的函数定义(在Python中实现)。
__future__
module仅保存有关要素的元数据,__future__.print_function
对象与print()
函数不是同一个对象。相反,该对象会告诉您更多关于Python首先支持该功能的版本,以及该功能成为必需的版本(以及from __future__
导入变为无操作),以及{的{1}位标志{1}}功能:
compile()
在Python 2.7中,内置函数对象(如>>> import __future__
>>> __future__.print_function
_Feature((2, 6, 0, 'alpha', 2), (3, 0, 0, 'alpha', 0), 65536)
>>> __future__.print_function.optional
(2, 6, 0, 'alpha', 2)
>>> __future__.print_function.mandatory
(3, 0, 0, 'alpha', 0)
>>> __future__.print_function.compiler_flag
65536
)根本没有足够的信息来发现它们支持的参数。在Python 3中,这会慢慢改变为more and more built-in types are given metadata,但print()
函数尚未包含在其中:
print()
我不知道你从哪个想法得到>>> import inspect
>>> inspect.signature(print)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/Users/mpietre/Development/Library/buildout.python/parts/opt/lib/python3.4/inspect.py", line 2045, in signature
return _signature_internal(obj)
File "/Users/mpietre/Development/Library/buildout.python/parts/opt/lib/python3.4/inspect.py", line 1947, in _signature_internal
skip_bound_arg=skip_bound_arg)
File "/Users/mpietre/Development/Library/buildout.python/parts/opt/lib/python3.4/inspect.py", line 1884, in _signature_from_builtin
raise ValueError("no signature found for builtin {!r}".format(func))
ValueError: no signature found for builtin <built-in function print>
是任何 Python版本中new
的有效关键字。没有支持该参数的Python版本。
Python 2中print()
缺少的唯一参数是Python 3.3及更高版本,print()
参数,请参阅Python 3 docs for print()
:
[...]如果 flush 关键字参数为true,则强制刷新流。
在版本3.3中更改:添加了 flush 关键字参数。
测试它的唯一方法(除了使用flush
进行测试)是尝试使用它:
sys.version_info >= (3, 3)