2016-08-28 1 views
1

J'ai remarqué que je ne peux pas utiliser flush avec la nouvelle fonction python après l'avoir importé en utilisant from __future__ import print_function. Dans mon voyage pour découvrir pourquoi j'ai découvert que je ne peux même pas inspecter quels arguments/paramètres il prend. Pourquoi est-ce?Pourquoi ne puis-je pas voir les arguments de la fonction d'impression importés à partir de l'avenir?

  1. D'abord j'ai vérifié que la fonction d'inspection fonctionnait.
  2. Ensuite, je me suis assuré que la fonction d'impression était bien une fonction.
  3. Après ces deux (semblait passer/vérifier) ​​j'ai essayé de l'inspecter mais cela a échoué et a renvoyé une erreur étrange.

voici ce que je faisais:

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) 

et tout passé, sauf l'impression d'inspection:

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 

Pourquoi est-il ainsi?


C'est quelques informations de mon python et système:

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. 
>>> 
+0

semble que je trouve quelque chose d'utile: http://bugs.python.org/issue6905 –

+0

Je l'ai lu mais je ne comprends pas pourquoi les fonctions C sont libres de traiter les choses comme * et * args kwargs: 'This Is pas un problème, mais une restriction fondamentale de ce que getargspec() peut faire. signatures de la fonction C ne sont pas introspecter, parce que fondamentalement toutes les fonctions C peut être considérée comme définie comme def func (* args) ou def func (* args, ** kwargs) et est libre de fais ce qu'il veut avec les args et kwargs.' –

+0

Comme le disent les docs,' inspect' ne fonctionne que sur du code Python pur, alors que beaucoup de builtins sont implémentés en C. Aussi, poser une question de suivi peu claire en tant que commentaire n'est probablement pas une bonne idée. – jonrsharpe

Répondre

2

Extrait de signature:

Remarque

Certains appelables peuvent ne pas être introspecter dans certaines implémentations de Python. Par exemple, dans CPython, les fonctions intégrées définies dans C ne fournissent aucune métadonnée sur leurs arguments.

J'ai posté les documents de signature parce inspect.getargspec est obsolète depuis 3.0

+0

pourquoi ne fournit-il pas docs/info pour les choses C? Je ne comprends pas le * pourquoi * –

+0

@CharlieParker car il utilise l'introspection Python, qui ne fonctionne pas sur C, car C n'est pas Python. – jonrsharpe

1

Le mot-clé flush a été ajouté à imprimer() 3.3.

Les fonctions C ne contiennent normalement pas les informations nécessaires à l'introspection. C'est simplement un fait de la façon dont C est défini et compilé. En tant que substitut, des signatures ont été ajoutées à leurs docstrings. Les appels au repos IDLE reviennent à la docstring si l'inspection ne fonctionne pas. En 3.4, un nouveau mécanisme a été ajouté pour inclure un attribut de signature avec une fonction codée en C. La nouvelle inspect.signature l'utilise lorsqu'elle est présente. Certaines fonctions codées en C ont été converties pour inclure le nouvel attribut, mais beaucoup ne l'ont pas été.