কোনও অবজেক্টের সমস্ত বর্তমান বৈশিষ্ট্য এবং মান মুদ্রণের জন্য কি কোনও অন্তর্নির্মিত ফাংশন রয়েছে?


957

সুতরাং আমি এখানে যা খুঁজছি তা পিএইচপি এর মুদ্রণ_আর ফাংশনের মতো।

এটি তাই আমি প্রশ্নে থাকা অবজেক্টের অবস্থা কী তা দেখে আমার স্ক্রিপ্টগুলি ডিবাগ করতে পারি।

উত্তর:


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আপনি নিজের উত্তরে মডিউল সম্পর্কে কেন বেশি কথা বলবেন না? আমি মনে করি এটি প্রিন্ট_আর বা ভার_ডাম্পের নিকটতম জিনিস।
হাই ফাইকাওল

1
dir()তাহলে তালিকাভুক্ত বৈশিষ্ট্যগুলির পিছনে থাকা মানগুলি কীভাবে আপনি অ্যাক্সেস করবেন ? dir()কেবলমাত্র নামেরগুলির একটি তালিকা ফেরত দেয়, এবং এগুলির সমস্তটিই vars()বা __dict__বৈশিষ্ট্যে বিদ্যমান নয় ।
হ্যালো গুডবাই

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

সেখানে অনেকগুলি তৃতীয় পক্ষের ফাংশন রয়েছে যা তাদের লেখকের পছন্দ অনুসারে ব্যতিক্রম হ্যান্ডলিং, জাতীয় / বিশেষ চরিত্রের মুদ্রণ, নেস্টেড বস্তুগুলিতে পুনরাবৃত্তি করা ইত্যাদি জিনিস যুক্ত করে add তবে তারা সমস্তই মূলত এটিতে সিদ্ধ হয়।


5
অযৌক্তিক, কারণ এখানে-উদ্ভাবিত নয়

14
বল কি? অবশ্যই, আপনি getmembers()স্ট্যান্ডার্ড inspectমডিউলটিতে ফাংশনটি ব্যবহার করতে পারেন , তবে আমি ভেবেছিলাম এটি সাধারণভাবে অন্তর্নির্ধারণের কীভাবে করবেন তা চিত্রিত করে এটি এটি আরও কার্যকর হবে।
ড্যান লেন্সকি

20
একদমই না. দির (আপত্তি) এমন বৈশিষ্ট্যগুলি দেখায় যা __dict__(যেমন __doc__এবং __module__) তেমন পাওয়া যায় না । তদ্ব্যতীত, __dict__ঘোষিত সামগ্রীর জন্য মোটেও কাজ করে না __slots__। সাধারণভাবে, __dict__ব্যবহারকারী-স্তরের বৈশিষ্ট্যগুলি দেখায় যা প্রকৃতপক্ষে অভ্যন্তরীণভাবে কোনও অভিধানে সঞ্চিত থাকে। dir () আরও দেখায়।
ড্যান লেন্সকি 19

8
কিছু শ্রেণি / অবজেক্টে কোনও __dict__বৈশিষ্ট্য / সদস্য থাকে না । আমি জানি এটি পাগল, তবে সত্য। মত বিল্ট-ইন intএবং strবা re.MatchObjectগুলি সাধারণ উদাহরণ। চেষ্টা করুন 'hello'.__dict__, তারপরে চেষ্টা করুনdir('hello')
hobs

11
সেগুলি «অযৌক্তিক» বা কী নয় সে বিষয়ে আমার কোনও খেয়াল নেই। এটি কাজটি সম্পন্ন করে, যা ডিবাগিংয়ে একমাত্র এবং একমাত্র বিষয় যা গুরুত্বপূর্ণ।
hidefromkgb

59

দির উল্লেখ করা হয়েছে, তবে এটি আপনাকে কেবল গুনের নাম দেবে। আপনি যদি তাদের মানগুলি চান তবে চেষ্টা করুন __ডিক্ট__।

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

এটি করতে আপনি "ডির ()" ফাংশনটি ব্যবহার করতে পারেন।

>>> 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__()যে এটি একটি বৈধ পাইথন এক্সপ্রেশন হতে হবে না: পরিবর্তে আরও সুবিধাজনক বা সংক্ষিপ্ত উপস্থাপনা ব্যবহার করা যেতে পারে। রিটার্ন মান অবশ্যই একটি স্ট্রিং অবজেক্ট হতে হবে।


এই বিকল্পটি সামগ্রীর সামগ্রীর সাথে একত্রিত স্ট্রিংগুলি মুদ্রণের জন্য দরকারী:print "DEBUG: object value: " + repr(obj)
আলেজান্দ্রোভিডি

17

চেক আউট মূল্যবান হতে পারে -

পারেলের ডেটা :: ডাম্পারের সমান পাইথন রয়েছে?

আমার সুপারিশটি হ'ল -

https://gist.github.com/1071857

নোট করুন যে পার্লের ডেটা :: ডাম্পার নামে একটি মডিউল রয়েছে যা পার্ট সোর্স কোডে এনজেক্ট ডেটা অনুবাদ করে (এনবি: এটি কোডটি উত্সে ফিরে অনুবাদ করে না, এবং প্রায়শই আপনি আউটপুটটিতে অবজেক্ট পদ্ধতি ফাংশন করতে চান না)। এটি অধ্যবসায়ের জন্য ব্যবহার করা যেতে পারে তবে সাধারণ উদ্দেশ্য ডিবাগিংয়ের জন্য।

স্ট্যান্ডার্ড পাইথন প্রিন্টটি অর্জন করতে ব্যর্থ হয় এমন অনেকগুলি বিষয় রয়েছে, বিশেষত এটি কেবল কোনও অবজেক্টের উদাহরণ দেখলে অবতরণ বন্ধ করে দেয় এবং আপনাকে বস্তুর অভ্যন্তরীণ হেক্স পয়েন্টার দেয় (ত্রুটিযুক্ত, সেই পয়েন্টারটি পুরো ব্যবহার নয়) রাস্তা). সুতরাং সংক্ষেপে, অজগর সমস্ত কিছুই এই দুর্দান্ত অবজেক্ট ওরিয়েন্টেড দৃষ্টান্ত সম্পর্কে, তবে আপনি যে সরঞ্জামগুলি বাক্স থেকে বেরিয়ে আসবেন তা অবজেক্ট ছাড়া অন্য কিছু নিয়ে কাজ করার জন্য তৈরি করা হয়েছে।

পার্ল ডেটা :: ডাম্পার আপনাকে কতটা গভীরভাবে যেতে চান তা নিয়ন্ত্রণ করতে দেয় এবং বিজ্ঞপ্তিযুক্ত লিঙ্কযুক্ত কাঠামো সনাক্ত করে (এটি সত্যই গুরুত্বপূর্ণ)। এই প্রক্রিয়াটি পার্লকে অর্জন করা মৌলিকভাবে সহজ কারণ বস্তুর তাদের আশীর্বাদ ছাড়াই কোনও নির্দিষ্ট যাদু নেই (একটি সর্বজনীনভাবে সংজ্ঞায়িত প্রক্রিয়া)।


এটি কেবল একটি টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টানা হয়!
ফোবি 18

2
> সুতরাং সংক্ষেপে বলা যেতে পারে, অজগর সমস্ত কিছুই এই দুর্দান্ত অবজেক্ট ওরিয়েন্টেড দৃষ্টান্ত সম্পর্কে, তবে আপনি যে সরঞ্জামগুলি বাক্স থেকে সরিয়ে নেবেন তা অবজেক্ট ছাড়া অন্য কিছু নিয়ে কাজ করার জন্য ডিজাইন করা হয়েছে ... বেশিরভাগ দাবি যখন আপনি সরবরাহ করছেন কেবলমাত্র উদাহরণটি হ'ল গৌণ গুরুত্বের মডিউল।
মেমপ্লেক্স

@ মেমপ্লেক্স কোথায় এটি বলে যে পাইথন সবই ওওপি সম্পর্কে ?
পিটার উড

ঠিক আছে, এটি কেবল বলেছেন যে এটি আমার দুর্দান্ত O
মেমপ্লেক্স

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__যথেষ্ট sufficient যদি আপনি সত্যিই স্বেচ্ছাচারিত বস্তুগুলির বর্তমান অবস্থার সন্ধান করতে চান (অজগরটিকে প্রায় সবই একটি বস্তু মনে করে) তবে inspectতা বিবেচনার জন্য উপযুক্ত।


সর্বাধিক সম্পূর্ণ উত্তরের উন্নতির জন্য পরিদর্শনে আপনার ব্যাখ্যা ব্যবহার করুন। আশা করি আপনার সাথে ঠিক আছে।
ফার্নান্দো সিজার

9

কোনও অবজেক্টের সমস্ত বর্তমান বৈশিষ্ট্য এবং মান মুদ্রণের জন্য কি কোনও অন্তর্নির্মিত ফাংশন রয়েছে?

না। সর্বাধিক উত্সাহিত উত্তরটি কিছু ধরণের বৈশিষ্ট্যকে বাদ দেয় এবং স্বীকৃত উত্তরটি দেখায় যে কীভাবে সমস্ত গুণাবলী পাওয়া যায়, পদ্ধতি এবং অ-পাবলিক এপিআইয়ের অংশগুলি সহ। তবে এর জন্য কোনও ভাল সম্পূর্ণ বিল্টইন ফাংশন নেই।

সুতরাং সংক্ষিপ্ত বিবরণটি হ'ল আপনি নিজের লেখা লিখতে পারেন তবে এটি বৈশিষ্ট্য এবং অন্যান্য গণনা করা ডেটা-বর্ণনাকারীদের গণনা করবে যা জনসাধারণের API এর অংশ, এবং আপনি এটি চান না:

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

@ নিউম্যাকবি ধন্যবাদ আমি মনে করি এটি পেয়েছি। সেবার হতে পেরে খুশি! :)
হারুন হলের

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

তর্ক ছাড়াই:

y পাইথন ডাম্প.পি
<__main__.Data instance at 0x00A052D8>

সঙ্গে মারেফাহ utils :

$ পাইথন ডাম্প.পি গ্নোসিস.ম্যাগিক মেটাএক্সএমএলপিক্লার
<?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))

এটি পাইথন ৩-তে কাজ করেনি, পাইমঙ্গো ইনস্টল করতে হবে এবং @ ক্লার্কের উত্তর অনুসারে এটি করতে হবে
টিম ওগিলভি

এখানে অন্যান্য উত্তরগুলির মতো অনেকগুলি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

"মাইবজেক্ট" ডাম্প করতে:

from bson import json_util
import json

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

আমি ভার () এবং দির () চেষ্টা করেছি; উভয়ই আমি যা খুঁজছিলাম তার জন্য ব্যর্থ। vars () কাজ করে না কারণ বস্তুটিতে __dict__ (ব্যতিক্রম রয়েছে। টাইপ এরিয়ার: ভারস () যুক্তিটিতে __dict__ বৈশিষ্ট্য থাকতে হবে)। dir () আমি যা খুঁজছিলাম তা ছিল না: এটি কেবল ক্ষেত্রের নামের তালিকা, মান বা বস্তুর কাঠামো দেয় না।

আমি মনে করি json.dumps () ডিফল্ট = json_util.default ব্যতীত বেশিরভাগ অবজেক্টের জন্য কাজ করবে তবে স্ট্যান্ডার্ড জসন সিরিয়ালাইজার ব্যর্থ হওয়ায় আমার অবজেক্টে ডেটটাইম ফিল্ড ছিল। পাইথনে "ডেটটাইম.ডেটটাইম জেএসএন সিরিয়ালাইজেবল নয়" কীভাবে কাটিয়ে উঠবেন দেখুন ?


ওকে হ্যাঁ এটি ব্যবহার করার জন্য পিমোঙ্গো ইনস্টল করতে হয়েছিল।
টিম ওগিলভি


2

প্রিন্টে আপনার ডেটা স্ট্রাকচারের নান্দনিকভাবে আনন্দদায়ক উপস্থাপনা তৈরি করার জন্য একটি " প্রিন্ট প্রিন্টার" রয়েছে। ফর্ম্যাটরটি এমন ডেটা স্ট্রাকচারের উপস্থাপনা তৈরি করে যা দোভাষী দ্বারা সঠিকভাবে পার্স করা যায় এবং একটি মানুষের পক্ষে পড়া সহজ হয়। যদি সম্ভব হয় তবে আউটপুটটি একটি একক লাইনে রাখা হয় এবং একাধিক লাইনের বিভাজনে ইন্ডেন্ট করা হয়।


2

শুধু বিপ্রিন্ট চেষ্টা করুন ।

এটি আপনাকে কেবল মুদ্রণের অবজেক্ট ভেরিয়েবলগুলিই নয়, পাশাপাশি সুন্দর আউটপুটও সহায়তা করবে:

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__ এর ভিতরে বা তার বাইরে শ্রেণীর মধ্যে সংজ্ঞায়িত করা যায় তা কার্যকর নয় works

your_obj = YourObj()
attrs_with_value = {attr: getattr(your_obj, attr) for attr in dir(your_obj)}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.