Почему я не могу увидеть аргументы функции печати, импортированной из будущего?

Я заметил, что после импортирования с помощью from __future__ import print_function я не могу использовать flush с новой функцией python. В своем путешествии, чтобы узнать, почему я обнаружил, я даже не могу проверить, какие аргументы/параметры он принимает. Почему?

  • Сначала я убедился, что функция проверки работает.
  • Затем я убедился, что функция печати действительно является функцией.
  • После этих двух (казалось, чтобы пройти/проверить) я попытался проверить его, но это не удалось и вернуло странную ошибку.

вот что я сделал:

from __future__ import print_function

import inspect

def f(a, b=1):
    pass

#print( print_function )
print( inspect.getargspec( f ) )
g = print
print('what is print: ', print)
print('what is g=print: ', g)
print( inspect.getargspec( g ) )
#print( inspect.getargspec( print ) )

#print('Hello', flush=True)

и все прошло, кроме проверки печати:

ArgSpec(args=['a', 'b'], varargs=None, keywords=None, defaults=(1,))
what is print?  <built-in function print>
what is g=print?  <built-in function print>
Traceback (most recent call last):
  File "print_future.py", line 16, in <module>
    print( inspect.getargspec( g ) )
  File "/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/inspect.py", line 816, in getargspec
    raise TypeError('{!r} is not a Python function'.format(func))
TypeError: <built-in function print> is not a Python function

Почему это происходит?


Это информация о моем питоне и системе:

Python 2.7.11 (default, Jun 24 2016, 21:50:11)
[GCC 4.2.1 Compatible Apple LLVM 7.3.0 (clang-703.0.31)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

Ответ 1

Извлечен из signature:

Примечание

Некоторые вызовы могут не быть интроспективными в некоторых реализациях Python. Например, в CPython встроенные функции, определенные в C не содержат метаданных об их аргументах.

Я опубликовал документы подписи, потому что inspect.getargspec устарел с версии 3.0

Ответ 2

К началу страницы() в 3.3 добавлено ключевое слово flush.

Функции C обычно не содержат с собой информацию, необходимую для интроспекции. Это просто факт того, как C определяется и компилируется. В качестве замены подписи были добавлены к их док-строкам. Идентификаторы IDLE возвращаются к docstring, если проверка не работает.

В 3.4 был добавлен новый механизм, включающий атрибут подписи с C-кодированной функцией. Новая контрольная подпись использует ее, когда она присутствует. Некоторые C-кодированные функции были преобразованы в новый атрибут, многие из них не имеют.