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?
- D'abord j'ai vérifié que la fonction d'inspection fonctionnait.
- Ensuite, je me suis assuré que la fonction d'impression était bien une fonction.
- 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.
>>>
semble que je trouve quelque chose d'utile: http://bugs.python.org/issue6905 –
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.' –
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