هناك المدمج في وظيفة طباعة كافة الحالي خصائص وقيم كائن ؟
-
08-07-2019 - |
سؤال
إذا ما كنت أبحث عنه هنا هو شيء مثل 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))
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()