سؤال

إذا ما كنت أبحث عنه هنا هو شيء مثل PHP print_r وظيفة.هذا حتى أتمكن من تصحيح البرامج النصية من خلال رؤية ما هي حالة الكائن في السؤال.

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

المحلول

ويمكنك خلط حقا معا هما شيئان مختلفان.

استخدم dir() و <لأ href = "HTTPS: // docs.python.org/3/library/functions.html#vars "يختلط =" noreferrer "> vars() أو في inspect حدة للحصول على ما كنت مهتما في (I استخدام __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__'}

نصائح أخرى

وأنت تريد vars() مختلطة مع pprint():

from pprint import pprint
pprint(vars(your_object))
def dump(obj):
  for attr in dir(obj):
    print("obj.%s = %r" % (attr, getattr(obj, attr)))

وهناك العديد من وظائف 3rd الطرف الى ان هناك إضافة أشياء مثل التعامل مع استثناء والوطنية طباعة حرف / الخاصة، recursing إلى أشياء متداخلة الخ وفقا لتفضيلات مؤلفيها. ولكنها جميعا تغلي في الأساس إلى هذا.

دير تم ذكرها، ولكن هذا سوف تعطيك فقط أسماء السمات. إذا كنت تريد قيمهم وكذلك محاولة __dict __.

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

o = O()

وهنا هو الإخراج:

>>> o.__dict__

{'value': 3}

طباعة الوضع الحالي الكائن قد:

>>> obj # in an interpreter

أو

print repr(obj) # in a script

أو

print obj

للفئات الخاصة بك تحديد __str__ أو __repr__ الأساليب.من وثائق بايثون:

__repr__(self) يسمى من قبل repr() المدمج في وظيفة من خلال سلسلة التحويلات (عكس علامات الاقتباس) حساب "الرسمية" سلسلة تمثيل كائن.على كل حال ممكن هذا ينبغي أن تبدو وكأنها صالح الثعبان التعبير التي يمكن أن تكون تستخدم لإعادة كائن مع نفس القيمة (نظرا مناسب البيئة).إذا كان هذا غير ممكن ، سلسلة من شكل "<بعض المعلومات المفيدة ... الوصف...>" يجب أن تعاد.العودة يجب أن تكون قيمة سلسلة الكائن.إذا فئة يعرف repr() ولكن ليس __str__(), ثم __repr__() هو تستخدم أيضا عند "غير رسمي" من سلسلة تمثيل حالات من هذا الدرجة المطلوبة.هذا هو عادة تستخدم من أجل التصحيح ، لذلك من المهم أن التمثيل هو المعلومات الغنية لا لبس فيه.

__str__(self) يسمى من قبل str() المدمج في وظيفة قبل الطباعة بيان على حساب "غير رسمية" تمثيل سلسلة من كائن.وهذا يختلف من __repr__() في هذا فإنه لا يجب أن تكون صالحة الثعبان التعبير:أكثر ملاءمة أو موجزة التمثيل يمكن استخدامها بدلا من ذلك.قيمة الإرجاع يجب أن يكون سلسلة كائن.

ويمكنك استخدام "دير ()" وظيفة للقيام بذلك.

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

قد يكون من المفيد التدقيق بها --

هل هناك بيثون ما يعادل بيرل البيانات::قلابة?

توصيتي هي هذه ..

https://gist.github.com/1071857

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

هناك عدد من الأمور القياسية الثعبان pprint فشل في تحقيق ذلك ، على وجه الخصوص هو فقط توقف عن تنازلي عندما يرى مثيل كائن و يعطيك الداخلية عرافة مؤشر الكائن (errr هذا المؤشر ليس الكثير من استخدام بالمناسبة).ذلك باختصار ، بيثون هو كل شيء عن هذا عظيم وجوه المنحى النموذج ، ولكن الأدوات التي تحصل في الخروج من مربع مصممة للعمل مع شيء آخر من الكائنات.

Perl البيانات::قلابة يسمح لك للسيطرة على مدى عمق تريد أن تذهب ، و أيضا بالكشف عن التعميم ربط الهياكل (هذا مهم جدا).هذه العملية هي في الأساس من الأسهل تحقيق في بيرل لأن الأجسام لا سيما السحر أبعد من نعمة (عالميا واضحة المعالم عملية).

في معظم الحالات باستخدام __dict__ أو dir() سوف تحصل على المعلومات التي كنت ترغب في.إذا كان يجب أن يحدث في حاجة إلى مزيد من التفاصيل ، المكتبة القياسية تشمل فحص وحدة الذي يسمح لك للحصول على كمية كبيرة من التفاصيل.من nuggests من المعلومات ما يلي:

  • أسماء وظيفة معلمات الأسلوب
  • الطبقة الهرمية
  • شفرة المصدر من تنفيذ المهام/كائنات فئة
  • المتغيرات المحلية خارج إطار كائن

إذا كنت تبحث فقط عن "ما قيم السمة لا كائن؟", ثم dir() و __dict__ ربما تكون كافية.إذا كنت حقا تبحث عن حفر في الوضع الحالي التعسفي الكائنات (مع الأخذ في الاعتبار أن في بيثون تقريبا كل ما هو كائن) ، ثم inspect يستحق النظر.

وهناك مثال metaprogramming تفريغ الكائن مع السحر :

$ cat dump.py
#!/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

وبدون حجج:

$ python dump.py
<__main__.Data instance at 0x00A052D8>

الغنوص تيلس :

$ python dump.py 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>

ومن عفا عليها الزمن قليلا ولكن لا تزال تعمل.

إذا كنت تستخدم هذا لتصحيح الأخطاء، وكنت ترغب فقط في تفريغ عودي من كل شيء، والجواب المقبول هو غير مرضية لأنها تتطلب أن الفصول الدراسية لها تطبيقات __str__ جيدة بالفعل. إذا كان هذا ليس هو الحال، وهذا يعمل على نحو أفضل بكثير:

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

وهذا بطباعة كافة محتويات الكائن بشكل متكرر في سلمان أو 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)

وأوصي باستخدام 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__.

وكنت تحتاج لطباعة معلومات التصحيح في بعض السجلات وكان غير قادر على استخدام pprint لأنه كسرها. بدلا من ذلك فعلت ذلك وحصلت تقريبا نفس الشيء.

DO = DemoObject()

itemDir = DO.__dict__

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

لتفريغ "myObject":

from bson import json_util
import json

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

وحاولت فار ()، ودير ()؛ سواء فشلت على ما كنت أبحث عنه. لم فار () لا يعمل لأن الكائن لم يكن لديهم __dict__ (exceptions.TypeError: فار () يجب أن يكون حجة __dict__ السمة). كان دير () ليس ما كنت أبحث عنه: انها مجرد قائمة من أسماء الحقول، لا يعطي القيم أو بنية الكائن

وأعتقد json.dumps () ستعمل لمعظم الأشياء من دون الافتراضي = json_util.default، ولكن كان حقل التاريخ والوقت في الجسم، وذلك فشل مسلسل سلمان القياسية. انظر كيفية التغلب على "datetime.datetime لا JSON تسلسل" في بيثون؟

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

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)

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

لماذا لا شيء بسيط:

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

ولقد upvoted الجواب الذي يذكر pprint فقط. أن نكون واضحين، إذا كنت تريد أن ترى كل <م> القيم في بنية البيانات المعقدة، ثم تفعل شيئا مثل:

from pprint import pprint
pprint(my_var)

وأين <م> my_var هو متغير اهتمامك. عندما كنت pprint (فار (my_var)) حصلت على أي شيء، وإجابات أخرى هنا لم تساعد أو طريقة بدا طويلة دون داع. بالمناسبة، في حالتي خاصة، رمز كان يتفقد زيارتها I قاموس من قواميس.

وتجدر الإشارة إلى أنه مع بعض فئات مخصصة لك للتو قد ينتهي مع نوع <someobject.ExampleClass object at 0x7f739267f400> غير مفيد من الانتاج. في هذه الحالة، قد يكون لديك لتنفيذ طريقة __str__، أو محاولة بعض الحلول الأخرى. أنا لا تزال ترغب في العثور على شيء بسيط يعمل في جميع السيناريوهات، دون المكتبات طرف ثالث.

beeprint .

ووسوف تساعدك ليس فقط مع متغيرات الكائنات الطباعة، ولكن الانتاج جميلة أيضا، مثل هذا:

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

الجميع يكافح مع

  • vars() لا ترد على كل الصفات.
  • dir() لا ترد على سمات القيم.

التعليمة البرمجية التالية طباعة كل سمات obj مع قيمها:

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

ويمكنك محاولة قارورة تصحيح شريط الأدوات.
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)

وأنا أحب العمل مع كائن الثعبان المدمج في أنواع <لأ href = "https://docs.python.org/2/library/stdtypes.html؟highlight=keys#dict.keys" يختلط = "نوفولو noreferrer" > مفاتيح أو القيم .

لسمات بغض هم الأساليب أو المتغيرات:

o.keys()

لقيم تلك السمات:

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