0

次の2つの方法があるfirst_methodsecond_methodします。

def first_method(some_arg):
    """
    This is the method that calls the second_method
    """

    return second_method(some_arg[1], some_arg[2])


def second_method(arg1, arg2):
    """
    This method can only be called from the first_method
    or it will raise an error.
    """

    if (some condition):
        #Execute the second_method
    else:
        raise SomeError("You are not authorized to call me!")

2番目のメソッドが最初のメソッドによって呼び出されていることをどのように確認し、それに従ってメソッドを処理できますか?

4

3 に答える 3

4

最初のメソッド内で 2 番目のメソッドを定義して、直接呼び出されないようにします。

例:

def first_method(some_arg):
    """
    This is the method that calls the second_method
    """
    def second_method(arg1, arg2):
        """
        This method can only be called from the first_method
        hence defined here
        """

        #Execute the second_method


    return second_method(some_arg[1], some_arg[2])
于 2012-12-21T05:49:55.700 に答える
1

inspect モジュールのいくつかのスタック関数を見ることができます。

しかし、あなたがしていることはおそらく悪い考えです。この種のことを強制しようとするのは、単に面倒なことではありません。2番目のメソッドが直接呼び出されることになっていないことを文書化し、先頭にアンダースコア(_secret_second_methodまたは何でも)を付けて名前を付けてください。誰かがそれを直接呼び出す場合、それは彼ら自身の問題です。

または、別のメソッドにしないで、コードを に正しく配置してfirst_methodください。1 つの場所以外から呼び出されることがないのに、なぜ別の関数にする必要があるのでしょうか? その場合、それは最初の方法の一部である可能性があります。

于 2012-12-21T05:45:02.040 に答える
1

Django とは特に関係のない、呼び出し元メソッド フレームを取得する方法の例を次に示します (そのフレームには多くの情報があります)。

import re, sys, thread

def s(string):
    if isinstance(string, unicode):
        t = str
    else:
        t = unicode
    def subst_variable(mo):
        name = mo.group(0)[2:-1]
        frame = sys._current_frames()[thread.get_ident()].f_back.f_back.f_back
        if name in frame.f_locals:
            value = t(frame.f_locals[name])
        elif name in frame.f_globals:
            value = t(frame.f_globals[name])
        else:
            raise StandardError('Unknown variable %s' % name)
        return value
    return re.sub('(#\{[a-zA-Z_][a-zA-Z0-9]*\})', subst_variable, string)

first = 'a'
second = 'b'
print s(u'My name is #{first} #{second}')

基本的にsys._current_frames()[thread.get_ident()]、フレーム リンク リストの先頭 (呼び出し元ごとのフレーム) を取得し、必要なランタイム情報を検索するために使用できます。

于 2012-12-21T05:49:32.757 に答える