2016-08-28 8 views
1

from __future__ import print_functionを使用して新しいPython関数をインポートした後、その関数を使ってフラッシュすることができないことに気付きました。なぜ私が発見したのか発見する私の旅で、私はどの引数/パラメータが必要かを調べることさえできません。それはなぜです?今後インポートされる印刷機能の引数が表示されないのはなぜですか?

  1. まず、検査機能が機能していることを確認しました。
  2. 次に、印刷機能が確かに機能であることを確認しました。
  3. これらの2つ(パスした/確認したように見える)の後、私はそれを検査しようとしましたが、これは失敗し、奇妙なエラーを返しました。ここ

は私がやったことです:なぜ起こっていることを

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 

:印刷検査以外

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) 

、すべてを通過しましたか?


これは私のpython、システムのいくつかの情報です:

signatureから抽出
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

私が何か役に立つ見つけるようだ:私はそれを読むが、Cの関数は、引数*と* kwargsからようなものを扱うために自由である理由を私は理解していないhttp://bugs.python.org/issue6905 –

+0

を: 'これは、問題ではありませんが、getargspec() の基本的な制限があります。いずれか デフFUNC(*引数) 又は デフFUNC(*引数、** kwargsから) として定義さに自由であるように、基本的に 毎C関数を考えることができるので、C関数シグネチャは、イントロスペクションではありませんargsとkwargsでそれが望むことをやりなさい。' –

+0

docsが言うように、' inspect'は純粋なPythonコードでのみ動作しますが、多くの組み込み関数はC言語で実装されています。また、不明確なフォローアップの質問をコメントとして尋ねるのは、おそらく素晴らしい考えではありません。 – jonrsharpe

答えて

2

いくつかの呼び出し可能オブジェクトは の特定の実装にはイントロスペクションではないかもしれませんPython。たとえば、CPythonでは、C で定義された組み込み関数は、引数についてのメタデータを提供しません。

inspect.getargspec

flushキーワードを3.3に()を印刷するために添加した3.0

+0

C用のドキュメント/情報を提供しないのはなぜですか?理由はわかりません* –

+0

@CharlieParker CがPythonではないので、Cで動作しないPythonのイントロスペクションを使用するためです。 – jonrsharpe

1

ので、廃止されたので、私は、署名ドキュメントを投稿しました。

C関数は通常、イントロスペクションに必要な情報を持ちません。それは単にCがどのように定義され、コンパイルされているかの事実です。代わりに、署名がドキュメントストリングに追加されました。 inspectが機能しない場合、IDLEコールチップはdocstringに戻ります。

3.4では、Cコード化された機能を持つ署名属性を含む新しいメカニズムが追加されました。新しいinspect.signatureは、存在する場合にそれを使用します。 Cコード化された関数の中には、新しい属性を含むように変換されているものがあります。

関連する問題