كيف يمكنك تحديد حيث يتم تعريف كل الممتلكات وطريقة فئة بيثون؟

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

سؤال

ونظرا مثيل بعض فئة في بيثون، سيكون من المفيد أن تكون قادرا على تحديد أي سطر من التعليمات البرمجية المصدر <م> تعريف كل طريقة والممتلكات (على سبيل المثال لتنفيذ <وأ href = "الشبكي: / /stackoverflow.com/questions/465605/how-do-i-make-ipython-organize-tab-completion-possibilities-by-class">1 ). على سبيل المثال، ونظرا لab.py حدة

class A(object):
    z = 1
    q = 2
    def y(self): pass
    def x(self): pass

class B(A):
    q = 4
    def x(self): pass
    def w(self): pass

وتحديد أين وظيفة (class_، سمة) إرجاع الصفوف (tuple) التي تحتوي على اسم الملف، والطبقة، والخط في التعليمات البرمجية المصدر أن يعرف أو subclassed attribute. وهذا يعني أن التعريف الوارد في الجسم الدرجة، وليس الأخير المهمة بسبب ديناميكية متحمس جدا. لا بأس اذا عاد "غير معروف" لبعض الصفات.

>>> a = A()
>>> b = B()
>>> b.spigot = 'brass'
>>> whither(a, 'z')
("ab.py", <class 'a.A'>, [line] 2)
>>> whither(b,  'q')
("ab.py", <class 'a.B'>, 8)
>>> whither(b, 'x')
("ab.py", <class 'a.B'>, 9)
>>> whither(b, 'spigot')
("Attribute 'spigot' is a data attribute")

وأريد استخدام هذا في حين introspecting بلون، حيث كل كائن لديها المئات من الأساليب وأنه سيكون من المفيد حقا لفرز من خلالهم نظمته الدرجة وليس فقط حسب الترتيب الأبجدي.

وبطبيعة الحال، في بيثون لا يمكنك دائما معرفة معقولة، ولكن سيكون من الجميل للحصول على أجوبة جيدة في حالة مشتركة من التعليمات البرمجية في الغالب ساكنة.

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

المحلول 2

هل تبحث عن وظيفة inspect.classify_class_attrs(cls) غير موثقة. تمريرها فئة وسيعود قائمة من المجموعات ('name', 'kind' e.g. 'method' or 'data', defining class, property). إذا كنت بحاجة إلى معلومات عن كل شيء في حالة محددة سيكون لديك للقيام بعمل إضافي.

مثال:

>>> import inspect
>>> import pprint
>>> import calendar
>>> 
>>> hc = calendar.HTMLCalendar()
>>> hc.__class__.pathos = None
>>> calendar.Calendar.phobos = None
>>> pprint.pprint(inspect.classify_class_attrs(hc.__class__))
[...
 ('__doc__',
  'data',
  <class 'calendar.HTMLCalendar'>,
  '\n    This calendar returns complete HTML pages.\n    '),
 ...
 ('__new__',
  'data',
  <type 'object'>,
  <built-in method __new__ of type object at 0x814fac0>),
 ...
 ('cssclasses',
  'data',
  <class 'calendar.HTMLCalendar'>,
  ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']),
 ('firstweekday',
  'property',
  <class 'calendar.Calendar'>,
  <property object at 0x98b8c34>),
 ('formatday',
  'method',
  <class 'calendar.HTMLCalendar'>,
  <function formatday at 0x98b7bc4>),
 ...
 ('pathos', 'data', <class 'calendar.HTMLCalendar'>, None),
 ('phobos', 'data', <class 'calendar.Calendar'>, None),
 ...
 ]

نصائح أخرى

وهذا هو أكثر أو أقل من المستحيل دون تحليل ساكنة، وحتى ذلك الحين، فإنه لن ينجح دائما. يمكنك الحصول على السطر حيث تم تعريف وظيفة وفي أي ملف من خلال دراسة الكائن رمزها، ولكن أبعد من ذلك، ليس هناك الكثير يمكنك القيام به. وحدة inspect يمكن أن تساعد في ذلك. لذلك:

import ab
a = ab.A()
meth = a.x
# So, now we have the method.
func = meth.im_func
# And the function from the method.
code = func.func_code
# And the code from the function!
print code.co_firstlineno, code.co_filename

# Or:
import inspect
print inspect.getsource(meth), inspect.getfile(meth)

ولكن النظر فيما يلي:

def some_method(self):
    pass
ab.A.some_method = some_method
ab.A.some_class_attribute = None

وأو ما هو أسوأ:

some_cls = ab.A
some_string_var = 'another_instance_attribute'
setattr(some_cls, some_string_var, None)

وخصوصا في الحالة الأخيرة، ماذا تريد أو تتوقع أن تحصل عليه؟

أنت تبحث عن تفقد حدة، inspect.getsourcefile() على وجه التحديد وinspect.getsourcelines(). على سبيل المثال

وa.py:

class Hello(object):
    def say(self):
       print 1

>>> from a import Hello
>>> hi = Hello()
>>> inspect.getsourcefile(hi.say)
a.py
>>> inspect.getsourcelines(A, foo)
(['   def say(self):\n        print 1\n'], 2)

ونظرا للطبيعة الديناميكية للبيثون، القيام بذلك لحالات أكثر تعقيدا ببساطة قد لا يكون ممكنا ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top