2016-12-08 4 views
0

呼び出し元が間違ったインスタンスの引数を取得すると、呼び出し元の__doc__属性を出力して終了するたびに呼び出される関数を作成します。私は__doc__属性を取得する必要があるステップで捕まってしまった呼び出し元関数がPythonで呼び出し側の属性を取得できるようにする

def checktype(objects,instances): 
    if not all([isinstance(obj,instance) for 
       obj,instance in zip(objects,instances)]): 
     print 'Type Error' 
     #Get __doc__ from caller 
     print __doc__ 
     exit() 

:機能は以下の通りです。

(あなたは3.5を含むすべてのPythonのバージョンと互換性のある別のものを、提案することができます)

name=inspect.stack()[1][3] 
possibles=globals().copy() 
__doc__= possibles.get(name).__doc__ 

が、私はそこにする必要がありだと思う:私はinspectモジュールは、次のような方法で、それを行うことができることを知っています別の方法。私の懐疑的な理由は、組み込みのreturnステートメントが呼び出し元に即座に何かを返すため、子関数でアクセス可能な "フック"または "パイプ"が必要であることを意味します。私の興味を引く最初の質問は次のとおりです:

このパイプは送信専用で、情報は逆向きに送信できませんか?

returnのステートメントは、検索したサイトで簡単に説明されているため、これには答えられませんでした。これとは別に、inspectモジュールは、私が知る限り、複数のフレームをスタックに保存し、常にバックグラウンドで実行します。私にとって、これは私がミニグンでフライを殺そうとしているようなものです。私は、10フレーム前の関数ではなく、呼び出し元関数の名前が必要です。これを達成する方法がない場合、私の意見では、これはPythonが持っていなければならない機能です。私の質問は次のとおりです。

Pythonで呼び出し元の属性を取得するための、Pythonプログラミングによる方法は何でしょうか?私の質問に無知がある場合は、私は任意の訂正と "心の開口部"に開いています。あなたの答えはありがとうございました。

+1

に関連している可能性があり、いくつかの機能を持っています。 – polku

+0

@polkuデコレータの中で関数の引数をどのように渡すかを知りたいと思うでしょう。シグナルハンドラが設定されていれば、ラッパーは良いアイデアですが、これはLinuxのディストリビューションにのみ適していると思います。 –

+0

デコレータの使い慣れたIDKですが、関数の引数を渡すことはありません。私の理解は、さまざまな機能のために再利用可能な型チェックの仕組みが必要だということです。それは私が使用するものです(印刷と終了の代わりにカスタム例外があります)が、間違っているかもしれません。 – polku

答えて

0

私はデコレータは、そのための適切なことだと思うあなたの問題

import sys 

def position(level = 0): 
    """return a tuple (code, lasti, lineno) where this function is called 

    If level > 0, go back up to that level in the calling stack. 
    """ 
    frame = sys._getframe(level + 1) 
    try: 
     return (frame.f_code, frame.f_lasti, frame.f_lineno) 
    finally: 
     del frame 

def line(level = 0): 
    """return a tuple (lineno, filename, funcname) where this function is called 

    If level > 0, go back up to that level in the calling stack. 

    The filename is the name in python's co_filename member 
    of code objects. 
    """ 
    code, lasti, lineno = position(level=level+1) 
    return (lineno, code.co_filename, code.co_name) 

def _globals(level = 0): 
    """return the globals() where this function is called 

    If level > 0, go back up to that level in the calling stack. 

    """ 
    frame = sys._getframe(level + 1) 
    try: 
     return frame.f_globals 
    finally: 
     del frame 
+0

ありがとうございます。私が知る限り、あなたは 'sys._getframe(1).f_code.co_name'を使うことを提案しています。これは私に関数の名前を取得しますが、他の属性は取得できません。良いアイデアです。このWindowsは互換性がありますか? –

+0

'_globals(1)[line(1)[2]] .__ doc__を試してください。これはOSにとらわれないものです。 – Gribouillis

+0

これは、私が組み込みモジュールを使用しているので、要求されたものであり、きれいです。 'f = sys._getframe(1); print f.f_globals [f.f_code.co_name] .__ doc__' –

関連する問題