الحصول على كل ما يشير إلى وظيفة الكائنات على كومة التنفيذ من وجوه الإطار؟

StackOverflow https://stackoverflow.com/questions/1034688

  •  06-07-2019
  •  | 
  •  

سؤال

ونظرا لإخراج inspect.stack()، هل من الممكن الحصول على الأشياء وظيفة من أي مكان من الإطار المكدس ونطلق على هذه؟ إذا كان الأمر كذلك، كيف؟

(وأنا أعلم مسبقا كيفية الحصول على أسماء من وظائف.)

وهنا هو ما أنا في الحصول: دعونا نقول أنا وظيفة وأنا أحاول تحديد ما إذا كان لي المتصل هو مولد أو وظيفة العادية؟ أحتاج إلى الاتصال inspect.isgeneratorfunction() على الكائن وظيفة. وكيف يمكنك معرفة ما الذي دعاكم؟ inspect.stack()، أليس كذلك؟ حتى لو كنت يمكن أن تضع حد ما تلك معا، وسوف يكون الجواب على سؤالي. ربما هناك أسهل طريقة للقيام بذلك؟

هل كانت مفيدة؟

المحلول

وهنا مقتطف الشفرة التي تفعل ذلك. لا يوجد التحقق من الخطأ. والفكرة هي أن تجد في السكان المحليين من جد الكائن وظيفة التي كانت تسمى. عاد الكائن وظيفة يجب أن يكون الوالد. إذا كنت تريد أيضا للبحث في builtins، ثم ننظر ببساطة الى أكوام [2] [0] .f_builtins.

def f():
    stacks  = inspect.stack()
    grand_parent_locals = stacks[2][0].f_locals
    caller_name = stacks[1][3]
    candidate = grand_parent_locals[caller_name]

في حالة وجود الطبقة، يمكن للمرء أن يكتب التالية (مستوحاة من حل مارسين)

class test(object):
    def f(self):
        stack = inspect.stack()
        parent_func_name = stack[1][3]
        parent_func = getattr(self, parent_func_name).im_func

نصائح أخرى

وأخذت النهج التالي، تشبه الى حد بعيد الجواب Eolmar ل.

stack = inspect.stack()
parent_locals = stack[1][0].f_locals['self']
parent_func_name = stack[1][3]
parent_func_attr = getattr(parent_locals,parent_func_name)
parent_func = parent_func_attr.im_func
is_parent_gen = inspect.isgeneratorfunction(func)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top