在python中获取__future__函数的参数名称

时间:2014-11-06 17:53:41

标签: python

我的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吗?

1 个答案:

答案 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)