限制只能通过其他方法调用的方法?

时间:2012-12-21 05:38:01

标签: python django methods call

我说我有两种方法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!")

如何检查第一种方法调用第二种方法(根据什么条件)并根据该方法处理方法?

3 个答案:

答案 0 :(得分:4)

为什么不在第一个方法中定义第二个方法,以便不直接调用它。

示例:

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])

答案 1 :(得分:1)

您可以查看inspect module中的一些堆栈函数。

但是,你在做什么可能是一个坏主意。尝试强制执行此类操作并不值得。只记录第二种方法不应该被直接调用,给它一个带有前导下划线(_secret_second_method或其他)的名称,然后如果有人直接调用它就是他们自己的问题。

或者,只是不要将它作为单独的方法并将代码放在first_method中。如果除了从一个地方以外从未调用它,为什么还需要将它作为一个单独的函数?在这种情况下,它也可能是第一种方法的一部分。

答案 2 :(得分: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()]获取帧链接列表的头部(每个调用者的帧),然后查找您想要的任何运行时信息。