मैं पायथन ऑब्जेक्ट के अंदर कैसे दिखूं?


292

मैं पायथन (Django वेब विकास और पांडा 3 डी खेल विकास सहित) का उपयोग करके विभिन्न परियोजनाओं में कोड डालना शुरू कर रहा हूं।

मुझे यह समझने में मदद करने के लिए कि क्या चल रहा है, मैं मूल रूप से पायथन ऑब्जेक्ट्स के अंदर 'देखना' चाहता हूं कि वे कैसे टिकते हैं - जैसे कि उनके तरीके और गुण।

तो कहते हैं कि मेरे पास एक पायथन ऑब्जेक्ट है, मुझे इसकी सामग्री को प्रिंट करने की क्या आवश्यकता होगी? क्या यह भी संभव है?

जवाबों:


352

पायथन में आत्मनिरीक्षण सुविधाओं का एक मजबूत सेट है।

निम्नलिखित अंतर्निहित कार्यों पर एक नज़र डालें :

type()और dir()विशेष रूप से एक वस्तु के प्रकार और उसके गुणों के सेट के निरीक्षण के लिए विशेष रूप से उपयोगी हैं।


25
नहीं जानता था कि यह शब्द 'आत्मनिरीक्षण' है। यह एक बड़ी मदद है! आपके द्वारा दिए गए सभी फंक्शन्स के अनुसार ... धन्यवाद!
छोटजिम little

2
प्रॉपर्टी, क्लासमेथोड और स्टैटिकमेथोड का संबंध आत्मनिरीक्षण से नहीं है। ये विधियाँ विशेष प्रकार की वस्तुओं का निर्माण करती हैं जिनका उपयोग कक्षाओं को विशेष व्यवहार के साथ परिभाषित करने के लिए किया जा सकता है, लेकिन उन कक्षाओं या निर्माणों का निरीक्षण करने में कोई मदद नहीं करता है।
सिंगलनेशन इलिमिनेशन

नीचे दिए गए @Brian के उत्तर से आपको पता चलता है कि अजगर के भीतर से विभिन्न अजगर वस्तुओं के स्रोत कोड को कैसे देखें। यही कारण है कि मैं मूल रूप से खोज रहा था और मुझे यकीन है कि मैं अकेला नहीं रहूंगा। (यह इस जवाब के बाद से यह सबसे स्वीकार किए जाते हैं है में अपने जवाब के लिए एक संदर्भ शामिल किया जा सकता है।)
michaelavila

यह अजगर के लिए अंतर्निहित "इंटेलीसेनस" जैसा है । मुझे यह पसंद है।
ब्रूनो बीरी

7
मुझे लगता है कि इसका बुरा जवाब है। हमें समाधान देने के बजाय यह हमें दस्तावेजीकरण में उससे जुड़ी हर चीज देता है
इशान श्रीवास्तव

176

object.__dict__


12
vars(object)उसी के लिए बना है।
आज़ाद करें

6
वास्तव में from pprint import pprint; pprint(vars(object))मुझे मेरी वस्तु की सामग्री पर बहुत अच्छा दृश्य दिया। धन्यवाद @liberforce
एन Maks

एक स्ट्रिंग में वस्तु और उसकी सामग्री को देखने का सबसे अच्छा तरीका
पीटर क्रस

यह वस्तुओं जो किसी भी प्रतिनिधित्व तरीकों को लागू करने को देखने के लिए एक शानदार तरीका है, या googleapiclient.errors.HttpError जो जब आप उन्हें मुद्रित वे यह सुनिश्चित करें के लिए अपर्याप्त जानकारी प्रिंट की तरह वस्तुओं, धन्यवाद @ mtasic85
फेलिप वाल्डेस

65

सबसे पहले, स्रोत पढ़ें।

दूसरा, dir()फ़ंक्शन का उपयोग करें ।


92
मैं उस आदेश को उलट दूंगा।
बायर

5
स्रोत डायर () की तुलना में अधिक जानकारीपूर्ण है और विकसित करने के लिए एक बेहतर आदत है।
एस.लॉट

14
क्षमा करें मैं असहमत हूं। dir () बस इतनी जल्दी है और 99% मामलों में आपको पता चलता है कि आपको मदद के साथ संयोजन में क्या चाहिए ()।
बायर जू

7
मैं आमतौर पर सहमत हूं। बहुत समय, एक सरल कॉल डायर () पर्याप्त होगा, इस प्रकार आपको स्रोत कोड के माध्यम से देखने की परेशानी से बचाना होगा।
साशा चोडगोव

3
रन टाइम में वस्तुओं का निरीक्षण करना उपयोगी हो सकता है लेकिन स्रोतों को पढ़ना नहीं। उदाहरण के लिए canplib.py कक्षाएं और उनके तरीके :)।
डेनिस बरमेनकोव

61

मुझे आश्चर्य है कि अभी तक किसी की उल्लेखित मदद नहीं मिली है!

In [1]: def foo():
   ...:     "foo!"
   ...:

In [2]: help(foo)
Help on function foo in module __main__:

foo()
    foo!

मदद से आप डॉकस्ट्रिंग पढ़ सकते हैं और यह जान सकते हैं कि क्लास में कौन-कौन सी विशेषताएँ हो सकती हैं, जो कि बहुत मददगार हैं।


फिर आप यहां बताई गई अन्य तकनीकों का उपयोग करें। लेकिन अगर डॉकस्ट्रिंग उपलब्ध है, तो इसे कैनन पर विचार करें।
एडवर्ड फॉक

मुझे यकीन नहीं है कि अगर पायथन ने पिछले कुछ वर्षों में इस फ़ंक्शन को अपडेट किया, लेकिन "मदद (object_name)" एक उच्च संरचित प्रारूप में एक पूर्ण अवलोकन प्रदान करता है। यह एक रक्षक है। धन्यवाद।
ब्रायन कगेलमैन

27

अगर यह देखने के लिए कि क्या चल रहा है, मैं IPython को देखने की सलाह दूंगा । यह एक ऑब्जेक्ट प्रलेखन, गुण और यहां तक ​​कि स्रोत कोड प्राप्त करने के लिए विभिन्न शॉर्टकट जोड़ता है। उदाहरण के लिए एक "?" एक फ़ंक्शन को ऑब्जेक्ट के लिए मदद देगा (प्रभावी रूप से "हेल्प (ओब्ज)" के लिए एक शॉर्टकट, दो का उपयोग करके व्हाट्सएप? (s (" func??") उपलब्ध होने पर सोर्सकोड प्रदर्शित करेगा।

बहुत सारी अतिरिक्त उपयुक्तताएं भी हैं, जैसे टैब पूरा करना, परिणामों की सुंदर छपाई, परिणाम इतिहास आदि जो इस तरह की खोजपूर्ण प्रोग्रामिंग के लिए बहुत उपयोगी हैं।

आत्मनिरीक्षण के अधिक कार्यक्रम संबंधी उपयोग के लिए, बुनियादी builtins चाहते dir(), vars(), getattrआदि के लिए उपयोगी हो जाएगा, लेकिन यह अच्छी तरह से बाहर की जाँच करने के लिए अपने समय के लायक है का निरीक्षण मॉड्यूल। किसी फ़ंक्शन के स्रोत को लाने के लिए, " inspect.getsource" का उपयोग करें , इसे स्वयं पर लागू करना:

>>> print inspect.getsource(inspect.getsource)
def getsource(object):
    """Return the text of the source code for an object.

    The argument may be a module, class, method, function, traceback, frame,
    or code object.  The source code is returned as a single string.  An
    IOError is raised if the source code cannot be retrieved."""
    lines, lnum = getsourcelines(object)
    return string.join(lines, '')

inspect.getargspec यदि आप रैपिंग या मैनिपुलेटिंग फ़ंक्शन के साथ काम कर रहे हैं तो यह अक्सर उपयोगी होता है, क्योंकि यह फ़ंक्शन मापदंडों के नाम और डिफ़ॉल्ट मान देगा।


19

यदि आप इसके लिए GUI में रुचि रखते हैं, तो objbrowser पर एक नज़र डालें । यह नीचे दिए गए ऑब्जेक्ट आत्मनिरीक्षण के लिए पायथन मानक पुस्तकालय से निरीक्षण मॉड्यूल का उपयोग करता है।

objbrowserscreenshot


9

आप शेल में किसी ऑब्जेक्ट की विशेषताओं को dir () के साथ सूचीबद्ध कर सकते हैं:

>>> dir(object())
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

बेशक, निरीक्षण मॉड्यूल भी है: http://docs.python.org/library/inspect.html#module-inspect


8
"""Visit http://diveintopython.net/"""

__author__ = "Mark Pilgrim (mark@diveintopython.org)"


def info(object, spacing=10, collapse=1):
    """Print methods and doc strings.

    Takes module, class, list, dictionary, or string."""
    methodList = [e for e in dir(object) if callable(getattr(object, e))]
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
    print "\n".join(["%s %s" %
                     (method.ljust(spacing),
                      processFunc(str(getattr(object, method).__doc__)))
                     for method in methodList])

if __name__ == "__main__":
    print help.__doc__

4
यह अजगर 3 में ठीक काम करता है अगर आप सिर्फ प्रिंट्स के चारों ओर परेंस जोड़ते हैं।
कांस्टेंटाइनके

8

कोशिश ppretty

from ppretty import ppretty


class A(object):
    s = 5

    def __init__(self):
        self._p = 8

    @property
    def foo(self):
        return range(10)


print ppretty(A(), indent='    ', depth=2, width=30, seq_length=6,
              show_protected=True, show_private=False, show_static=True,
              show_properties=True, show_address=True)

आउटपुट:

__main__.A at 0x1debd68L (
    _p = 8, 
    foo = [0, 1, 2, ..., 7, 8, 9], 
    s = 5
)

8

जबकि pprintदूसरों द्वारा पहले ही उल्लेख किया गया है मैं कुछ संदर्भ जोड़ना चाहूंगा।

पाइरेट मॉड्यूल एक ऐसे रूप में पायथन डेटा संरचनाओं को "सुंदर-प्रिंट" करने की क्षमता प्रदान करता है जिसे दुभाषिया के इनपुट के रूप में इस्तेमाल किया जा सकता है। यदि स्वरूपित संरचनाओं में ऐसी वस्तुएँ शामिल होती हैं जो मूल पायथन प्रकार नहीं हैं, तो प्रतिनिधित्व लोड नहीं हो सकता है। यह मामला हो सकता है यदि ऑब्जेक्ट जैसे कि फ़ाइलें, सॉकेट, कक्षाएं, या इंस्टेंस शामिल हैं, साथ ही कई अन्य अंतर्निहित ऑब्जेक्ट भी हैं जो पायथन स्थिरांक के रूप में प्रतिनिधित्व करने योग्य नहीं हैं।

pprintएक PHP पृष्ठभूमि के साथ डेवलपर्स द्वारा उच्च-मांग में हो सकता है जो एक विकल्प की तलाश कर रहे हैं var_dump()

एक तानाशाह विशेषता वाली वस्तुओं को अच्छी तरह से pprint()मिश्रित करके इस्तेमाल किया जा सकता है vars(), जो __dict__एक मॉड्यूल, वर्ग, उदाहरण, आदि के लिए विशेषता देता है ।:

from pprint import pprint
pprint(vars(your_object))

तो, लूप की कोई आवश्यकता नहीं है

वैश्विक या स्थानीय दायरे में निहित सभी चरों को बस उपयोग करने के लिए:

pprint(globals())
pprint(locals())

locals()किसी फ़ंक्शन में परिभाषित चर दिखाता है।
यह एक स्ट्रिंग कुंजी के रूप में उनके संगत नाम के साथ अन्य उपयोगों के बीच कार्यों का उपयोग करने के लिए भी उपयोगी है :

locals()['foo']() # foo()
globals()['foo']() # foo()

इसी तरह, dir()किसी मॉड्यूल की सामग्री, या किसी ऑब्जेक्ट की विशेषताओं को देखने के लिए उपयोग करना।

और अभी और भी है।


7

अन्य लोगों ने पहले ही dir () बिल्ट-इन का उल्लेख किया है, जिसमें लगता है कि आप क्या देख रहे हैं, लेकिन यहाँ एक और अच्छा टिप है। कई पुस्तकालय - जिनमें अधिकांश मानक पुस्तकालय शामिल हैं - स्रोत रूप में वितरित किए जाते हैं। मतलब आप बहुत आसानी से सीधे सोर्स कोड पढ़ सकते हैं। चाल उसे खोजने में है; उदाहरण के लिए:

>>> import string
>>> string.__file__
'/usr/lib/python2.5/string.pyc'

* .Pyc फ़ाइल संकलित की जाती है, इसलिए अनुगामी 'ग' को हटा दें और अपने पसंदीदा संपादक या फ़ाइल दर्शक में अनपेक्षित * .py फ़ाइल खोलें:

/usr/lib/python2.5/string.py

मैंने इसे चीजों की खोज के लिए अविश्वसनीय रूप से उपयोगी पाया है, जैसे कि किसी दिए गए एपीआई से अपवाद उठाए गए हैं। इस तरह का विस्तार शायद ही अजगर दुनिया में अच्छी तरह से प्रलेखित है।


4

यदि आप मापदंडों और विधियों को देखना चाहते हैं, जैसा कि अन्य ने बताया है कि आप अच्छी तरह से उपयोग कर सकते हैं pprintयाdir()

यदि आप सामग्री का वास्तविक मूल्य देखना चाहते हैं, तो आप कर सकते हैं

object.__dict__


4

निरीक्षण कोड के लिए दो महान उपकरण हैं:

  1. IPython । एक अजगर टर्मिनल जो आपको टैब पूरा करने का उपयोग करके निरीक्षण करने की अनुमति देता है।

  2. PyDev प्लगइन के साथ ग्रहण करें । इसमें एक उत्कृष्ट डिबगर है जो आपको किसी दिए गए स्थान पर तोड़ने और सभी चर को एक पेड़ के रूप में ब्राउज़ करके वस्तुओं का निरीक्षण करने की अनुमति देता है। आप उस स्थान पर कोड आज़माने के लिए एम्बेडेड टर्मिनल का उपयोग कर सकते हैं या ऑब्जेक्ट टाइप कर सकते हैं और दबा सकते हैं। ' यह आपके लिए कोड संकेत देने के लिए है

यहां छवि विवरण दर्ज करें


3

pprint और dir मिलकर बहुत अच्छा काम करते हैं


3

इस उद्देश्य के लिए सिर्फ एक पायथन कोड लाइब्रेरी का निर्माण किया गया है: पायथन 2.7 में प्रस्तुत किया गया निरीक्षण


3

आप समारोह वस्तु के लिए इसी के स्रोत कोड को देखने के लिए रुचि रखते हैं myobj, तो आप में टाइप कर सकते हैं iPythonया Jupyter Notebook:

myobj??


2
import pprint

pprint.pprint(obj.__dict__)

या

pprint.pprint(vars(obj))

इस कोड को इस सवाल का जवाब कर सकते हैं, के बारे में अतिरिक्त संदर्भ प्रदान करने के लिए कैसे और / या क्यों यह हल करती है समस्या जवाब की दीर्घकालिक मूल्य में सुधार होगा।
अलेक्जेंडर

1

यदि आप लाइव ऑब्जेक्ट के अंदर देखना चाहते हैं, तो अजगर का inspectमॉड्यूल एक अच्छा जवाब है। सामान्य तौर पर, यह उन कार्यों के स्रोत कोड को प्राप्त करने के लिए काम करता है जो डिस्क पर कहीं स्रोत फ़ाइल में परिभाषित होते हैं। आप लाइव कार्य करता है और lambdas का स्रोत है कि दुभाषिया में परिभाषित किया गया प्राप्त करना चाहते हैं, तो आप उपयोग कर सकते हैं dill.source.getsourceसे dill। यह बाध्य या अनबाउंड वर्ग विधियों और करी में परिभाषित कार्यों से भी कोड प्राप्त कर सकता है ... हालाँकि, आप उस कोड को संलग्न वस्तु के कोड के बिना संकलित करने में सक्षम नहीं हो सकते हैं।

>>> from dill.source import getsource
>>> 
>>> def add(x,y):
...   return x+y
... 
>>> squared = lambda x:x**2
>>> 
>>> print getsource(add)
def add(x,y):
  return x+y

>>> print getsource(squared)
squared = lambda x:x**2

>>> 
>>> class Foo(object):
...   def bar(self, x):
...     return x*x+x
... 
>>> f = Foo()
>>> 
>>> print getsource(f.bar)
def bar(self, x):
    return x*x+x

>>> 


1

पहले से ही कई अच्छे टिप्पी, लेकिन सबसे छोटा और सबसे आसान (जरूरी नहीं कि सबसे अच्छा) अभी तक उल्लेख किया गया है:

object?

0

इसके अलावा यदि आप सूची और शब्दकोशों के अंदर देखना चाहते हैं, तो आप पदचिह्न () का उपयोग कर सकते हैं


-4

प्रयोग करके देखें:

print(object.stringify())
  • objectउस ऑब्जेक्ट का चर नाम जहां आप निरीक्षण करने का प्रयास कर रहे हैं।

यह एक अच्छी तरह से स्वरूपित और टैब किए गए आउटपुट को प्रिंट करता है जो ऑब्जेक्ट में कुंजियों और मूल्यों के सभी पदानुक्रम को दर्शाता है।

नोट: यह python3 में काम करता है। निश्चित नहीं है कि यह पूर्व संस्करणों में काम करता है या नहीं

अद्यतन: यह सभी प्रकार की वस्तुओं पर काम नहीं करता है। यदि आप उन प्रकारों में से एक का सामना करते हैं (जैसे अनुरोध वस्तु), तो इसके बजाय निम्नलिखित में से किसी एक का उपयोग करें:

  • dir(object())

या

import pprint फिर: pprint.pprint(object.__dict__)


1
'रिक्वेस्ट' ऑब्जेक्ट पर काम नहीं करता है। रिक्वेस्ट 'ऑब्जेक्ट' में कोई विशेषता '
स्ट्रिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.