क्या किसी वस्तु के सभी वर्तमान गुणों और मूल्यों को प्रिंट करने के लिए एक अंतर्निहित फ़ंक्शन है?


957

तो मैं यहाँ जो कुछ देख रहा हूँ वह PHP के Print_r फंक्शन जैसा है।

ऐसा इसलिए है कि मैं अपनी स्क्रिप्ट को देखकर यह बता सकता हूं कि प्रश्न में ऑब्जेक्ट की स्थिति क्या है।

जवाबों:


590

आप वास्तव में दो अलग-अलग चीजों को एक साथ मिला रहे हैं।

उपयोग करें dir(), vars()या inspectमॉड्यूल जो आप में रुचि रखते हैं पाने के लिए (मैं __builtins__एक उदाहरण के रूप में उपयोग करता हूं ; आप इसके बजाय किसी भी वस्तु का उपयोग कर सकते हैं)।

>>> l = dir(__builtins__)
>>> d = __builtins__.__dict__

उस शब्दकोश को प्रिंट करें जिसे आप पसंद करते हैं:

>>> print l
['ArithmeticError', 'AssertionError', 'AttributeError',...

या

>>> from pprint import pprint
>>> pprint(l)
['ArithmeticError',
 'AssertionError',
 'AttributeError',
 'BaseException',
 'DeprecationWarning',
...

>>> pprint(d, indent=2)
{ 'ArithmeticError': <type 'exceptions.ArithmeticError'>,
  'AssertionError': <type 'exceptions.AssertionError'>,
  'AttributeError': <type 'exceptions.AttributeError'>,
...
  '_': [ 'ArithmeticError',
         'AssertionError',
         'AttributeError',
         'BaseException',
         'DeprecationWarning',
...

एक कमांड के रूप में सुंदर डिबेट इंटरएक्टिव डिबगर में भी उपलब्ध है:

(Pdb) pp vars()
{'__builtins__': {'ArithmeticError': <type 'exceptions.ArithmeticError'>,
                  'AssertionError': <type 'exceptions.AssertionError'>,
                  'AttributeError': <type 'exceptions.AttributeError'>,
                  'BaseException': <type 'exceptions.BaseException'>,
                  'BufferError': <type 'exceptions.BufferError'>,
                  ...
                  'zip': <built-in function zip>},
 '__file__': 'pass.py',
 '__name__': '__main__'}

28
हैरानी की बात है, ऐसा लगता है कि सभी वस्तुओं में एक __dict__सदस्य ( re.MatchObjectउदाहरण के लिए) नहीं है, लेकिन बिलिन dir()सभी वस्तुओं के लिए काम करता है।
hobs

print re.compile(r'slots').search('No slots here either.').__slots__
hobs

3
मेरे लिए नया। धन्यवाद। डॉट ने मेरे मस्तिष्क के मॉड्यूल पथ पार्सर को ट्रिगर किया। कभी भी लैटिन को "मॉड्यूल" नहीं माना जाता है।
hobs

4
आप inspectअपने उत्तर में मॉड्यूल के बारे में अधिक बात क्यों नहीं करते ? मुझे लगता है कि यह print_r या var_dump की निकटतम चीज़ है।
है फीकावल

1
फिर आप सूचीबद्ध विशेषताओं के पीछे के मूल्यों का उपयोग कैसे करते हैं dir()? dir()केवल नामों की एक सूची देता है, और उन सभी में मौजूद नहीं है vars()या __dict__विशेषता में है।
HelloGoodbye

981

आप के vars()साथ मिश्रित करना चाहते हैं pprint():

from pprint import pprint
pprint(vars(your_object))

24
vars()बस __dict__अपनी दलील पर वापस लौटता है और dir()अगर कोई __dir__विधि नहीं है तो यह भी है। तो dir()पहली जगह में उपयोग करें , जैसा कि मैंने कहा।

28
@ एचओपी: dir()आपको उन सभी चीजों को देता है जिन्हें आप शायद पसंद नहीं करते हैं __str__और __new__var()ऐसा नहीं करता।
टिम्मम

14
यह सेट और अन्य ऑब्जेक्ट्स में विफल रहता है जिनमें __dict__विशेषता नहीं है ।
अनातोली टेकटोनिक

209
def dump(obj):
  for attr in dir(obj):
    print("obj.%s = %r" % (attr, getattr(obj, attr)))

वहाँ कई 3-पार्टी फ़ंक्शंस हैं जो अपने लेखकों की वरीयताओं के अनुसार अपवाद हैंडलिंग, राष्ट्रीय / विशेष चरित्र मुद्रण, नेस्टेड ऑब्जेक्ट्स में पुनरावर्तन आदि चीजें जोड़ते हैं। लेकिन वे सभी मूल रूप से इसके लिए उबलते हैं।


5
यूथेथोनिक, क्योंकि यहां आविष्कार नहीं किया गया है

14
क्या कहना? निश्चित रूप से, आप getmembers()मानक inspectमॉड्यूल में फ़ंक्शन का उपयोग कर सकते हैं , लेकिन मुझे लगा कि यह अधिक उपयोगी होगा कि यह दिखाता है कि सामान्य रूप से आत्मनिरीक्षण कैसे किया जाए।
डैन लेन्स्की

20
बिल्कुल नहीं। dir (obj) उन गुणों को दर्शाता है जो __dict__(जैसे __doc__और __module__) में नहीं पाए जाते हैं । इसके अलावा, __dict__घोषित वस्तुओं के लिए बिल्कुल भी काम नहीं करता है __slots__। सामान्य तौर पर, __dict__उपयोगकर्ता-स्तरीय गुण दिखाता है जो वास्तव में आंतरिक रूप से एक शब्दकोश में संग्रहीत होते हैं। dir () अधिक दिखाता है।
डैन लेन्स्की

8
कुछ वर्गों / वस्तुओं में कोई __dict__विशेषता / सदस्य नहीं होता है । मुझे पता है कि यह पागल है, लेकिन सच है। जैसे अंतर्निहित इन की intऔर strया re.MatchObjectरों सामान्य उदाहरण हैं। कोशिश करो 'hello'.__dict__, फिर कोशिश करोdir('hello')
हॉब्स

11
मुझे परवाह नहीं है कि क्या वह `अनहैप्टोनिक` है या क्या नहीं। यह काम हो जाता है, जो डिबगिंग में एक और केवल एक चीज है जो मायने रखती है।
हिडेनफ्रॉम्बकॉब

59

dir का उल्लेख किया गया है, लेकिन यह आपको केवल विशेषताओं के नाम देगा। यदि आप उनके मूल्यों के साथ-साथ __dict__ भी चाहते हैं।

class O:
   def __init__ (self):
      self.value = 3

o = O()

यहाँ उत्पादन है:

>>> o.__dict__

{'value': 3}

9
वस्तुओं की तरह setनहीं है __dict__, इसलिए उनके लिए यह असफल होगाAttributeError: 'set' object has no attribute '__dict__'
अनातोली techtonik

23

आप ऐसा करने के लिए "dir ()" फ़ंक्शन का उपयोग कर सकते हैं।

>>> import sys
>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__', '__stdin__', '__stdo
t__', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder
, 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'exc_clear', 'exc_info'
 'exc_type', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getcheckinterval', 'getdefault
ncoding', 'getfilesystemencoding', 'getrecursionlimit', 'getrefcount', 'getwindowsversion', 'he
version', 'maxint', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_
ache', 'platform', 'prefix', 'ps1', 'ps2', 'setcheckinterval', 'setprofile', 'setrecursionlimit
, 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoption
', 'winver']
>>>

एक अन्य उपयोगी सुविधा मदद है।

>>> help(sys)
Help on built-in module sys:

NAME
    sys

FILE
    (built-in)

MODULE DOCS
    http://www.python.org/doc/current/lib/module-sys.html

DESCRIPTION
    This module provides access to some objects used or maintained by the
    interpreter and to functions that interact strongly with the interpreter.

    Dynamic objects:

    argv -- command line arguments; argv[0] is the script pathname if known

22

ऑब्जेक्ट की वर्तमान स्थिति को प्रिंट करने के लिए आप निम्न कर सकते हैं:

>>> obj # in an interpreter

या

print repr(obj) # in a script

या

print obj

अपनी कक्षाओं के लिए परिभाषित __str__या __repr__तरीके। से अजगर प्रलेखन :

__repr__(self)repr()अंतर्निहित फ़ंक्शन द्वारा और किसी वस्तु के "आधिकारिक" स्ट्रिंग प्रतिनिधित्व की गणना करने के लिए स्ट्रिंग रूपांतरण (रिवर्स उद्धरण) द्वारा कहा जाता है । यदि संभव हो तो, यह एक वैध पायथन अभिव्यक्ति की तरह दिखना चाहिए जिसका उपयोग किसी वस्तु को उसी मूल्य (एक उपयुक्त वातावरण दिया गया) को फिर से बनाने के लिए किया जा सकता है। यदि यह संभव नहीं है, तो फॉर्म का एक तार "<... कुछ उपयोगी विवरण ...>" लौटाया जाना चाहिए। वापसी मान एक स्ट्रिंग ऑब्जेक्ट होना चाहिए। यदि कोई वर्ग repr () को परिभाषित करता है __str__(), लेकिन तब __repr__()भी प्रयोग नहीं किया जाता है, जब उस वर्ग के उदाहरणों के "अनौपचारिक" स्ट्रिंग प्रतिनिधित्व की आवश्यकता होती है। यह आमतौर पर डिबगिंग के लिए उपयोग किया जाता है, इसलिए यह महत्वपूर्ण है कि प्रतिनिधित्व सूचना-समृद्ध और असंदिग्ध हो।

__str__(self)str()अंतर्निहित फ़ंक्शन द्वारा और किसी वस्तु के "अनौपचारिक" स्ट्रिंग प्रतिनिधित्व की गणना करने के लिए प्रिंट स्टेटमेंट द्वारा कहा जाता है । यह इस बात से भिन्न __repr__()है कि इसमें एक मान्य पायथन अभिव्यक्ति नहीं है: इसके बजाय अधिक सुविधाजनक या संक्षिप्त प्रतिनिधित्व का उपयोग किया जा सकता है। वापसी मान एक स्ट्रिंग ऑब्जेक्ट होना चाहिए।


: यह विकल्प वस्तु की सामग्री के साथ concatenated मुद्रण तार के लिए उपयोगी हैprint "DEBUG: object value: " + repr(obj)
AlejandroVD

17

हो सकता है इसे देखना महंगा न पड़े --

क्या पर्ल के डेटा के बराबर एक पायथन है :: डम्पर?

मेरी सिफारिश यह है -

https://gist.github.com/1071857

ध्यान दें कि पर्ल में डेटा :: डम्पर नामक एक मॉड्यूल होता है, जो ऑब्जेक्ट डेटा को perl सोर्स कोड में वापस ट्रांसलेट करता है (NB: यह कोड को सोर्स में वापस ट्रांसलेट नहीं करता है, और लगभग हमेशा आप आउटपुट में ऑब्जेक्ट मेथड फ़ंक्शन को नहीं चाहते हैं)। यह दृढ़ता के लिए इस्तेमाल किया जा सकता है, लेकिन आम उद्देश्य डिबगिंग के लिए है।

कई चीजें हैं मानक पायथन पाइंट हासिल करने में विफल रहता है, विशेष रूप से यह बस अवरोही बंद हो जाता है जब यह एक वस्तु का उदाहरण देखता है और आपको ऑब्जेक्ट का आंतरिक हेक्स पॉइंटर देता है (इर्र, वह सूचक पूरी तरह से उपयोग नहीं होता है) रास्ता)। तो संक्षेप में, अजगर इस महान ऑब्जेक्ट ओरिएंटेड प्रतिमान के बारे में है, लेकिन जो उपकरण आपको बॉक्स से बाहर निकलते हैं, उन्हें ऑब्जेक्ट्स के अलावा किसी अन्य चीज़ के साथ काम करने के लिए डिज़ाइन किया गया है।

पर्ल डेटा :: डम्पर आपको नियंत्रित करने की अनुमति देता है कि आप कितनी गहराई तक जाना चाहते हैं, और परिपत्र जुड़े संरचनाओं का भी पता लगाता है (यह वास्तव में महत्वपूर्ण है)। यह प्रक्रिया मूल रूप से पर्ल में हासिल करना आसान है क्योंकि वस्तुओं का उनके आशीर्वाद (एक सार्वभौमिक रूप से अच्छी तरह से परिभाषित प्रक्रिया) से परे कोई विशेष जादू नहीं है।


यह एक पाइप और एक बहस होना चाहिए न कि केवल एक जिस्ट!
फोबिया

2
> तो संक्षेप में, अजगर इस महान वस्तु उन्मुख प्रतिमान के बारे में सब है, लेकिन आपके द्वारा बॉक्स से बाहर निकलने वाले उपकरण वस्तुओं के अलावा किसी अन्य चीज के साथ काम करने के लिए डिज़ाइन किए गए हैं ... केवल एक उदाहरण प्रदान कर रहे हैं जब एक दावा है माध्यमिक महत्व का मॉड्यूल।
मेमेप्लेक्स

@ मिमेप्लेक्स जहां यह कहता है कि अजगर ऑप के बारे में है ?
पीटर वुड

ठीक है, यह सिर्फ कहता है कि यह सब इस महान ओओपी के बारे में है , मेरा बुरा।
मेमेप्लेक्स

13

मैं उपयोग करने की सलाह देता हूं help(your_object)

help(dir)

 If called without an argument, return the names in the current scope.
 Else, return an alphabetized list of names comprising (some of) the attributes
 of the given object, and of attributes reachable from it.
 If the object supplies a method named __dir__, it will be used; otherwise
 the default dir() logic is used and returns:
 for a module object: the module's attributes.
 for a class object:  its attributes, and recursively the attributes
 of its bases.
 for any other object: its attributes, its class's attributes, and
 recursively the attributes of its class's base classes.

help(vars)

Without arguments, equivalent to locals().
With an argument, equivalent to object.__dict__.

ओह, आदमी, +100500
किर्बी

12

ज्यादातर मामलों में, आपके द्वारा वांछित जानकारी का उपयोग __dict__या dir()प्राप्त करेंगे। यदि आपको अधिक विवरण की आवश्यकता होती है, तो मानक पुस्तकालय में निरीक्षण मॉड्यूल शामिल होता है, जो आपको कुछ प्रभावशाली राशि प्राप्त करने की अनुमति देता है। जानकारी के कुछ वास्तविक नामों में शामिल हैं:

  • फ़ंक्शन और विधि मापदंडों के नाम
  • वर्ग पदानुक्रम
  • किसी फ़ंक्शन / क्लास ऑब्जेक्ट के कार्यान्वयन का स्रोत कोड
  • स्थानीय चर एक फ्रेम ऑब्जेक्ट से बाहर

यदि आप सिर्फ "क्या विशेषता मान मेरी वस्तु है?" के लिए देख रहे हैं, तो dir()और __dict__शायद पर्याप्त हैं। यदि आप वास्तव में मनमानी वस्तुओं की वर्तमान स्थिति में खुदाई करना चाहते हैं (ध्यान में रखते हुए कि अजगर में लगभग सब कुछ एक वस्तु है), तो inspectविचार के योग्य है।


सबसे पूर्ण उत्तर को बेहतर बनाने के लिए निरीक्षण पर अपनी व्याख्या का उपयोग किया। आशा है कि आपके साथ ठीक है।
फर्नांडो सेसर

9

क्या किसी वस्तु के सभी वर्तमान गुणों और मूल्यों को प्रिंट करने के लिए एक अंतर्निहित फ़ंक्शन है?

नहीं। सबसे अधिक उत्तर दिया गया उत्तर कुछ प्रकार की विशेषताओं को बाहर करता है, और स्वीकृत उत्तर दिखाता है कि सभी विशेषताओं को कैसे प्राप्त किया जाए , जिसमें गैर-सार्वजनिक एपि के तरीके और भाग शामिल हैं। लेकिन इसके लिए कोई अच्छा पूर्ण बिल्टइन फ़ंक्शन नहीं है।

इसलिए छोटी कोरोलरी यह है कि आप अपना स्वयं का लिख ​​सकते हैं, लेकिन यह संपत्तियों और अन्य गणना किए गए डेटा-डिस्क्रिप्टर की गणना करेगा जो सार्वजनिक एपीआई का हिस्सा हैं, और आप ऐसा नहीं चाहते हैं:

from pprint import pprint
from inspect import getmembers
from types import FunctionType

def attributes(obj):
    disallowed_names = {
      name for name, value in getmembers(type(obj)) 
        if isinstance(value, FunctionType)}
    return {
      name: getattr(obj, name) for name in dir(obj) 
        if name[0] != '_' and name not in disallowed_names and hasattr(obj, name)}

def print_attributes(obj):
    pprint(attributes(obj))

अन्य उत्तरों के साथ समस्या

विभिन्न प्रकार के डेटा सदस्यों के एक वर्ग के साथ वर्तमान में शीर्ष मतदान वाले उत्तर के आवेदन का निरीक्षण करें:

from pprint import pprint

class Obj:
    __slots__ = 'foo', 'bar', '__dict__'
    def __init__(self, baz):
        self.foo = ''
        self.bar = 0
        self.baz = baz
    @property
    def quux(self):
        return self.foo * self.bar

obj = Obj('baz')
pprint(vars(obj))

केवल प्रिंट:

{'baz': 'baz'}

क्योंकि vars केवल__dict__ एक वस्तु वापस आती है , और यह एक प्रति नहीं है, इसलिए यदि आप वेरिए द्वारा लौटाए गए हुक्म को संशोधित करते हैं, तो आप __dict__स्वयं वस्तु को संशोधित कर रहे हैं ।

vars(obj)['quux'] = 'WHAT?!'
vars(obj)

रिटर्न:

{'baz': 'baz', 'quux': 'WHAT?!'}

- जो बुरा है क्योंकि क्वक्स एक ऐसी संपत्ति है जिसे हमें स्थापित नहीं करना चाहिए और नामस्थान में नहीं होना चाहिए ...

वर्तमान में स्वीकृत उत्तर (और अन्य) में सलाह को लागू करना ज्यादा बेहतर नहीं है:

>>> dir(obj)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', 'bar', 'baz', 'foo', 'quux']

जैसा कि हम देख सकते हैं, dirकेवल एक वस्तु से जुड़े नामों के सभी (वास्तव में सिर्फ सबसे) वापस करता है।

inspect.getmembersटिप्पणियों में उल्लिखित, समान रूप से त्रुटिपूर्ण है - यह सभी नामों और मूल्यों को लौटाता है ।

कक्षा से

पढ़ाने के दौरान मेरे पास मेरे छात्र एक ऐसा कार्य करते हैं जो किसी वस्तु का शब्दार्थ सार्वजनिक एपीआई प्रदान करता है:

def api(obj):
    return [name for name in dir(obj) if name[0] != '_']

हम किसी वस्तु के शब्दार्थ नाम स्थान की एक प्रति प्रदान करने के लिए इसका विस्तार कर सकते हैं , लेकिन हमें __slots__यह निर्दिष्ट करने की आवश्यकता नहीं है कि हमें असाइन नहीं किया गया है, और यदि हम "वर्तमान गुणों" के लिए अनुरोध को गंभीरता से ले रहे हैं, तो हमें गणना किए गए गुणों को बाहर करने की आवश्यकता है (जैसा कि) वे महंगे हो सकते हैं, और "वर्तमान" नहीं के रूप में व्याख्या की जा सकती है:)

from types import FunctionType
from inspect import getmembers

def attrs(obj):
     disallowed_properties = {
       name for name, value in getmembers(type(obj)) 
         if isinstance(value, (property, FunctionType))}
     return {
       name: getattr(obj, name) for name in api(obj) 
         if name not in disallowed_properties and hasattr(obj, name)}

और अब हम संपत्ति की गणना या प्रदर्शन नहीं करते हैं:

>>> attrs(obj)
{'bar': 0, 'baz': 'baz', 'foo': ''}

चेतावनियां

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

फिर हमें इस फ़ंक्शन को और अनुकूलित करने की आवश्यकता है। और इसलिए यह समझ में आता है कि हमारे पास एक अंतर्निहित फ़ंक्शन नहीं हो सकता है जो जादुई रूप से वास्तव में जानता है कि हम क्या चाहते हैं और इसे प्रदान करते हैं। यह कार्यशीलता है जिसे हमें स्वयं बनाने की आवश्यकता है।

निष्कर्ष

कोई अंतर्निहित फ़ंक्शन नहीं है जो ऐसा करता है, और आपको वह करना चाहिए जो आपकी स्थिति के लिए सबसे उपयुक्त है।


इसके बाद एक अतिरिक्त करीबी कोष्ठक है FunctionType। लेकिन बहुत मददगार - धन्यवाद!
nealmcb

@nealmcb धन्यवाद मुझे लगता है कि मुझे मिल गया। सेवा का होकर ख़ुशी है! :)
हारून हॉल

7

जादू के साथ एक मेटाप्रोग्रामिंग उदाहरण डंप ऑब्जेक्ट :

$ बिल्ली डंपडोम
#!/usr/bin/python
import sys
if len(sys.argv) > 2:
    module, metaklass  = sys.argv[1:3]
    m = __import__(module, globals(), locals(), [metaklass])
    __metaclass__ = getattr(m, metaklass)

class Data:
    def __init__(self):
        self.num = 38
        self.lst = ['a','b','c']
        self.str = 'spam'
    dumps   = lambda self: repr(self)
    __str__ = lambda self: self.dumps()

data = Data()
print data

तर्क के बिना:

$ अजगर डंप-थ्रू
<__main__.Data instance at 0x00A052D8>

सूक्ति बर्तन के साथ :

$ अजगर डंपडोम gnosis.magic MetaXMLPickler
<?xml version="1.0"?>
<!DOCTYPE PyObject SYSTEM "PyObjects.dtd">
<PyObject module="__main__" class="Data" id="11038416">
<attr name="lst" type="list" id="11196136" >
  <item type="string" value="a" />
  <item type="string" value="b" />
  <item type="string" value="c" />
</attr>
<attr name="num" type="numeric" value="38" />
<attr name="str" type="string" value="spam" />
</PyObject>

यह थोड़ा पुराना है लेकिन फिर भी काम कर रहा है।


6

यदि आप डिबगिंग के लिए इसका उपयोग कर रहे हैं, और आप बस हर चीज का एक पुनरावर्ती डंप चाहते हैं, तो स्वीकृत उत्तर असंतोषजनक है क्योंकि इसके लिए आवश्यक है कि आपकी कक्षाओं में __str__पहले से ही अच्छा कार्यान्वयन हो। अगर ऐसा नहीं है, तो यह बेहतर काम करता है:

import json
print(json.dumps(YOUR_OBJECT, 
                 default=lambda obj: vars(obj),
                 indent=1))

यह अजगर पर काम नहीं किया। 3. pymongo को स्थापित करने और इसे @ क्लार्क के उत्तर के अनुसार करना था
टिम ओगिल्वी

यहाँ अन्य उत्तर के समान हीTypeError: vars() argument must have __dict__ attribute
लूटने

6

कोशिश 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(), show_protected=True, show_static=True, show_properties=True)

आउटपुट:

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

वास्तव में मैं त्वरित डिबग के लिए क्या देख रहा था :), महान खोज!
जोसेफ एस्ट्राहन

थोड़ा संकेत गहराई जोड़ें = 6 (या हालांकि अभी तक आपको इसकी आवश्यकता है) इसके मापदंडों में से एक के रूप में और पुनरावर्तन विवरण आगे जा सकते हैं :)। चीजों में से एक मुझे पसंद है कि यह कैसे प्रिंट करता है यह सूची है यह पहले 2 एंट्री और अंतिम 2 प्रविष्टियों को दिखाता है ताकि आप यह जान सकें कि यह काम कर रहा है
जोसेफ एस्ट्रहान

4
from pprint import pprint

def print_r(the_object):
    print ("CLASS: ", the_object.__class__.__name__, " (BASE CLASS: ", the_object.__class__.__bases__,")")
    pprint(vars(the_object))

4

यह सभी वस्तु सामग्रियों को पुन: मुद्रित करता है, जो कि json या yaml इंडेंट फॉर्मेट में हैं:

import jsonpickle # pip install jsonpickle
import json
import yaml # pip install pyyaml

serialized = jsonpickle.encode(obj, max_depth=2) # max_depth is optional
print json.dumps(json.loads(serialized), indent=4)
print yaml.dump(yaml.load(serialized), indent=4)

4

मैंने उस उत्तर को उकेरा है जिसमें केवल पदचिह्न का उल्लेख है। स्पष्ट होने के लिए, यदि आप एक जटिल डेटा संरचना के सभी मूल्यों को देखना चाहते हैं , तो कुछ ऐसा करें:

from pprint import pprint
pprint(my_var)

जहाँ my_var आपकी रुचि का चर है। जब मैंने उपयोग किया तो pprint(vars(my_var))मुझे कुछ नहीं मिला, और यहाँ अन्य उत्तर मदद नहीं करते थे या विधि अनावश्यक रूप से लंबी लगती थी। वैसे, मेरे विशेष मामले में, जिस कोड का मैं निरीक्षण कर रहा था, उसमें शब्दकोशों का एक शब्दकोश था।

इस बात की ओर इशारा करते हुए कि कुछ कस्टम क्लासेस से आप अनचाहे <someobject.ExampleClass object at 0x7f739267f400>तरह के आउटपुट के साथ समाप्त हो सकते हैं । उस स्थिति में, आपको एक __str__विधि को लागू करना पड़ सकता है , या कुछ अन्य समाधानों की कोशिश कर सकते हैं। मैं अभी भी कुछ सरल ढूंढना चाहता हूं जो सभी परिदृश्यों में काम करता है, तीसरे पक्ष के पुस्तकालयों के बिना।


3
> कुछ कस्टम कक्षाओं के साथ ... यही कारण है कि मैं अजगर का प्रशंसक नहीं हूं। चीजें "कभी-कभी" काम करती हैं और "कभी-कभी" नहीं
AlxVallejo

3

मुझे कुछ लॉग्स में DEBUG जानकारी को प्रिंट करने की आवश्यकता थी और यह प्रिंट का उपयोग करने में असमर्थ था क्योंकि यह इसे तोड़ देगा। इसके बजाय मैंने ऐसा किया और वस्तुतः वही हुआ।

DO = DemoObject()

itemDir = DO.__dict__

for i in itemDir:
    print '{0}  :  {1}'.format(i, itemDir[i])

3

"MyObject" को डंप करने के लिए:

from bson import json_util
import json

print(json.dumps(myObject, default=json_util.default, sort_keys=True, indent=4, separators=(',', ': ')))

मैंने vars () और dir () की कोशिश की; दोनों उस चीज के लिए असफल रहे जिसकी मुझे तलाश थी। vars () ने काम नहीं किया, क्योंकि ऑब्जेक्ट में __dict__ (अपवाद नहीं है। टाइप करें: vars () तर्क में __dict__ विशेषता होना चाहिए)। dir () वह नहीं था जो मैं देख रहा था: यह केवल फ़ील्ड नामों की एक सूची है, मान या ऑब्जेक्ट संरचना नहीं देता है।

मुझे लगता है कि json.dumps () डिफ़ॉल्ट के बिना अधिकांश ऑब्जेक्ट्स के लिए काम करेगा = json_util.default, लेकिन मेरे पास ऑब्जेक्ट में एक डेटाइम फ़ील्ड था, इसलिए मानक json क्रमांक विफल रहा। देखें कि अजगर में "डेटाइम लाइफटाइम नहीं JSON अनुक्रमिक" कैसे पार करें?


इसका उपयोग करने के लिए ओके याप को पाइमोन्गो थियो स्थापित करना पड़ा।
टिम ओगिलवी

3

कुछ सरल क्यों नहीं:

for key,value in obj.__dict__.iteritems():
    print key,value

ऐसा नहीं होना चाहिए for key,value in obj.__dict__.iteritems(): print key,value?
रज़

2

pprint में आपके डेटा स्ट्रक्चर्स के सौंदर्यप्रद मनभावन अभ्यावेदन के निर्माण के लिए "सुंदर प्रिंटर" होता है। फ़ॉर्मेटर डेटा संरचनाओं का प्रतिनिधित्व करता है जो दुभाषिया द्वारा सही ढंग से पार्स किया जा सकता है, और मानव के लिए पढ़ना भी आसान है। आउटपुट को एक लाइन पर रखा जाता है, यदि संभव हो, और कई लाइनों में विभाजित होने पर इंडेंट किया जाता है।


2

बस beeprint की कोशिश करो

यह आपको न केवल मुद्रण ऑब्जेक्ट चर के साथ, बल्कि सुंदर आउटपुट के साथ भी मदद करेगा:

class(NormalClassNewStyle):
  dicts: {
  },
  lists: [],
  static_props: 1,
  tupl: (1, 2)

1
यह मॉड्यूल किसी भी अधिक बनाए रखने के लिए नहीं लगता है और कई खुले मुद्दे हैं। बल्कि व्याख्या का
वेवसैलर

1

हर कोई संघर्ष कर रहा है

  • vars() सभी विशेषताओं को वापस नहीं।
  • dir() विशेषताओं के मूल्यों को वापस नहीं।

निम्नलिखित कोड उनके मूल्यों के साथ सभी विशेषताओं को प्रिंट objकरता है:

for attr in dir(obj):
        try:
            print("obj.{} = {}".format(attr, getattr(obj, attr)))
        except AttributeError:
            print("obj.{} = ?".format(attr))

कोई त्रुटि नहीं है, लेकिन पुनरावर्ती नहीं है तो बस बहुत सारे हेक्स पते प्राप्त करें
लूट लें

0

आप फ्लास्क डीबग टूलबार आज़मा सकते हैं।
https://pypi.python.org/pypi/Flask-DebugToolbar

from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension

app = Flask(__name__)

# the toolbar is only enabled in debug mode:
app.debug = True

# set a 'SECRET_KEY' to enable the Flask session cookies
app.config['SECRET_KEY'] = '<replace with a secret key>'

toolbar = DebugToolbarExtension(app)

0

मुझे पायथन ऑब्जेक्ट बिल्ट-इन टाइप कुंजियों या मूल्यों के साथ काम करना पसंद है ।

विशेषताओं के लिए भले ही वे तरीके या चर हों:

o.keys()

उन विशेषताओं के मूल्यों के लिए:

o.values()

0

इससे कोई फर्क नहीं पड़ता कि आपके वैरिएबल को __init__ के अंदर या बाहर किसी वर्ग में कैसे परिभाषित किया जाता है।

your_obj = YourObj()
attrs_with_value = {attr: getattr(your_obj, attr) for attr in dir(your_obj)}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.