example - random.randint python




هل توجد وظيفة مضمنة لطباعة كل الخصائص والقيم الحالية لكائن؟ (15)

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


أنا أحب العمل مع أنواع keys الثعبان المدمج في keys أو values .

بالنسبة للسمات بغض النظر عن أنها أساليب أو متغيرات:

o.keys()

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

o.values()

أنت بالفعل تجمع شيئين مختلفين.

استخدم 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__'}

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

from pprint import pprint
pprint(vars(your_object))

تمت الإشارة إلى dir ، ولكن ذلك سيعطيك أسماء السمات فقط. إذا كنت تريد قيمهم أيضًا حاول __dict__.

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

o = O()

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

>>> o.__dict__

{'value': 3}

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

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

إذا كنت تبحث فقط عن "ما هي قيم السمات التي __dict__ الكائن الخاص بي؟" ، فقد تكون dir() و __dict__ على الأرجح كافية. إذا كنت تتطلع حقاً إلى البحث عن الحالة الراهنة للأشياء التعسفية (مع الأخذ في الاعتبار أن كل شيء تقريباً في الثعبان هو شيء) ، فإن inspect يكون جديراً بالاعتبار.


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

هل هناك بايثون مكافئ لبيانات بيرل :: Dumper؟

توصيتي هي -

https://gist.github.com/1071857

لاحظ أن perl يحتوي على وحدة نمطية تسمى Data :: Dumper تقوم بترجمة بيانات الكائن مرة أخرى إلى رمز perl المصدر (NB: لا يترجم الشفرة إلى المصدر ، وغالبًا ما لا تريد وظائف أسلوب الكائن في الإخراج). يمكن استخدام هذا للمثابرة ، ولكن الغرض المشترك هو تصحيح الأخطاء.

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

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


لتفريغ "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 القياسي. راجع كيفية التغلب على "datetime.datetime لا JSON serializable" في python؟


لطباعة الحالة الحالية للكائن ، يمكنك:

>>> obj # in an interpreter

أو

print repr(obj) # in a script

أو

print obj

__str__ تحدد أساليب __repr__ أو __repr__ . من وثائق بايثون :

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

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


لكل شخص يعاني

  • vars() عدم إرجاع كافة السمات.
  • dir() عدم إرجاع قيم السمات.

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

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

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

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

مجرد محاولة beeprint

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

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

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

يمكنك استخدام وظيفة "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

يمكنك تجربة شريط الأدوات Flask Debug.
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)

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




python-datamodel