পাইথন অবজেক্টের ভিতরে কীভাবে দেখব?


291

আমি পাইথন (জ্যাঙ্গো ওয়েব বিকাশ এবং পান্ডা 3 ডি গেম ডেভলপমেন্ট সহ) ব্যবহার করে বিভিন্ন প্রকল্পে কোড শুরু করছি।

কী হচ্ছে তা আমাকে বুঝতে সাহায্য করার জন্য, আমি পাইথন অবজেক্টগুলিতে মূলত তাদের দেখতে এবং দেখতে কীভাবে তাদের পদ্ধতি এবং বৈশিষ্ট্যগুলি লক্ষ্য করে তা দেখতে 'দেখতে' চাই।

সুতরাং বলুন আমার কাছে পাইথন অবজেক্ট রয়েছে, এর সামগ্রীগুলি মুদ্রণের জন্য আমার কী দরকার? এটা কি সম্ভব?

উত্তর:


352

পাইথনের অন্তঃনির্ধারণ বৈশিষ্ট্যগুলির একটি শক্তিশালী সেট রয়েছে।

নিম্নলিখিত অন্তর্নির্মিত ফাংশনগুলি একবার দেখুন :

type()এবং dir()যথাক্রমে কোনও বস্তুর ধরণ এবং এর বৈশিষ্ট্যগুলির সেট পরিদর্শন করার জন্য বিশেষভাবে কার্যকর।


25
শব্দটি 'অন্তর্নিবেশ' ছিল জানেন না। এটি একটি দুর্দান্ত সাহায্য! আপনি আমাকে দিয়েছেন এমন সমস্ত ফান্টন পাশাপাশি ... ধন্যবাদ!
লিটলজিম 84

2
সম্পত্তি, শ্রেণীবদ্ধ এবং স্থিতিস্থাপক আত্মবিজ্ঞানের সাথে সম্পর্কিত নয়। এই পদ্ধতিগুলি সমস্ত বিশেষ ধরণের অবজেক্ট তৈরি করে যা বিশেষ আচরণের সাথে শ্রেণিগুলি সংজ্ঞায়িত করতে ব্যবহৃত হতে পারে, তবে এই শ্রেণিগুলি বা নির্মাণগুলি পরিদর্শন করতে কোনও সহায়ক হয় না।
একক নেগেশন নির্মূল

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

এটি পাইথনের জন্য অন্তর্নির্মিত "ইন্টেলিসেন্স" এর মতো । আমি এটা ভালোবাসি.
ব্রুনো বিয়েরি

7
আমি এটি একটি খারাপ উত্তর মনে করি। পরিবর্তে আমাদের একটি সমাধান দেবার এটা শুধু আমাদের ডকুমেন্টেশন যে সবকিছু সম্পর্কিত দেয়
ঈশান শ্রীবাস্তব

176

object.__dict__


12
vars(object)তার জন্য তৈরি
লিবারফোর্স

6
আসলে from pprint import pprint; pprint(vars(object))আমার অবজেক্টের বিষয়বস্তুগুলিতে আমাকে একটি দুর্দান্ত দৃশ্য দিয়েছে। ধন্যবাদ @ লিবারফোর্স
এন। মাকস

স্ট্রিংতে অবজেক্ট এবং এর সামগ্রীগুলি দেখার সর্বোত্তম উপায়
পিটার ক্রাউস

যে কোনও উপস্থাপনা পদ্ধতি, বা গুগলাপিক্লিয়েন্ট.অরফারেন্সের মতো বিষয়গুলি কার্যকর করে এমন অবজেক্টগুলি দেখার এটি একটি দুর্দান্ত উপায় tt HTTP এরর যা আপনি এগুলি মুদ্রণ করলে তারা নিশ্চিতভাবে অপর্যাপ্ত তথ্য প্রিন্ট করেন, ধন্যবাদ @ এমটিএসিক 85
ফিলিপ

65

প্রথমে উত্সটি পড়ুন।

দ্বিতীয়ত, dir()ফাংশনটি ব্যবহার করুন ।


92
আমি সেই আদেশটি উল্টে দেব।
বায়ার

5
উত্সটি ডিয়ার () এর চেয়ে বেশি তথ্যবহুল এবং বিকাশের আরও ভাল অভ্যাস।
এসলট

14
আমি আলাদা করতে অনুরোধ। দির () কেবলমাত্র এত দ্রুত এবং 99% ক্ষেত্রে আপনি সাহায্যের () সাহায্যে সম্মিলিতভাবে কী প্রয়োজন তা খুঁজে বার করুন।
বায়ার

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

3
চলমান সময়ে কিছু সময় অবজেক্টগুলি পরীক্ষা করা কার্যকর হতে পারে তবে পড়ার উত্স নয়। যেমন httplib.py ক্লাস এবং তাদের পদ্ধতি :)।
ডেনিস বারমেনকোভ

61

আমি অবাক হয়েছি এখনও কারও উল্লিখিত সাহায্য নেই!

In [1]: def foo():
   ...:     "foo!"
   ...:

In [2]: help(foo)
Help on function foo in module __main__:

foo()
    foo!

সহায়তা আপনাকে ডকাস্ট্রিং পড়তে এবং কোনও শ্রেণীর কী কী বৈশিষ্ট্য থাকতে পারে সে সম্পর্কে ধারণা পেতে দেয় যা বেশ সহায়ক।


তারপরে আপনি এখানে উল্লিখিত অন্যান্য কৌশলগুলি ব্যবহার করুন। তবে যদি ডকাস্ট্রিং উপলব্ধ থাকে তবে এটি ক্যানন বিবেচনা করুন।
এডওয়ার্ড ফালক

আমি নিশ্চিত না যে পাইথন গত কয়েক বছরে এই ফাংশনটি আপডেট করেছে, তবে "সহায়তা (অবজেক্ট_নাম)" অত্যন্ত কাঠামোগত বিন্যাসে একটি সম্পূর্ণ ওভারভিউ সরবরাহ করে। এটা একজন রক্ষক ধন্যবাদ।
ব্রায়ান কিউজলম্যান

27

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

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

অন্তর্দর্শন আরো কর্মসূচি ব্যবহারের জন্য, মৌলিক builtins পছন্দ dir(), vars(), getattrইত্যাদি উপযোগী হতে হবে, কিন্তু এটা ভাল পরীক্ষা করার জন্য আপনার সময় সাধ্যমতো পরিদর্শন মডিউল। কোনও ফাংশনের উত্স আনতে, " inspect.getsource" উদাহরণস্বরূপ, এটি নিজে প্রয়োগ করুন:

>>> print inspect.getsource(inspect.getsource)
def getsource(object):
    """Return the text of the source code for an object.

    The argument may be a module, class, method, function, traceback, frame,
    or code object.  The source code is returned as a single string.  An
    IOError is raised if the source code cannot be retrieved."""
    lines, lnum = getsourcelines(object)
    return string.join(lines, '')

inspect.getargspec এছাড়াও আপনি প্রায়শই কার্যকর হয় যদি আপনি মোড়ানো বা ফাংশনগুলি পরিচালনা করে থাকেন তবে এটি ফাংশন প্যারামিটারগুলির নাম এবং ডিফল্ট মান দেয়।


17

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

objbrowserscreenshot


9

আপনি শেলের মধ্যে dir () দিয়ে কোনও বস্তুর বৈশিষ্ট্য তালিকাভুক্ত করতে পারেন:

>>> dir(object())
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

অবশ্যই, পরিদর্শন মডিউলটিও রয়েছে: http://docs.python.org/library/inspect.html#module-inspect


8
"""Visit http://diveintopython.net/"""

__author__ = "Mark Pilgrim (mark@diveintopython.org)"


def info(object, spacing=10, collapse=1):
    """Print methods and doc strings.

    Takes module, class, list, dictionary, or string."""
    methodList = [e for e in dir(object) if callable(getattr(object, e))]
    processFunc = collapse and (lambda s: " ".join(s.split())) or (lambda s: s)
    print "\n".join(["%s %s" %
                     (method.ljust(spacing),
                      processFunc(str(getattr(object, method).__doc__)))
                     for method in methodList])

if __name__ == "__main__":
    print help.__doc__

4
অজগর 3 এ এটি সূক্ষ্মভাবে কাজ করে যদি আপনি কেবল প্রিন্টগুলির চারপাশে পেরেন যোগ করেন।
কনস্ট্যান্টাইনেকে

8

চেষ্টা 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(), indent='    ', depth=2, width=30, seq_length=6,
              show_protected=True, show_private=False, show_static=True,
              show_properties=True, show_address=True)

আউটপুট:

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

7

অন্যরা ইতিমধ্যে অন্তর্নির্মিত দির () এর কথা বলেছে যা আপনি যা খুঁজছেন তা মনে হচ্ছে তবে এখানে আরও একটি ভাল পরামর্শ। বেশিরভাগ স্ট্যান্ডার্ড লাইব্রেরি সহ অনেক গ্রন্থাগার উত্স আকারে বিতরণ করা হয়। মানে আপনি খুব সহজেই সোর্স কোডটি সরাসরি পড়তে পারেন। কৌশলটি এটি সন্ধানের মধ্যে রয়েছে; উদাহরণ স্বরূপ:

>>> import string
>>> string.__file__
'/usr/lib/python2.5/string.pyc'

* .Pyc ফাইলটি সংকলিত হয়েছে, সুতরাং 'সি'টিকে অনুসরণ করুন এবং আপনার প্রিয় সম্পাদক বা ফাইল দর্শকের মধ্যে বিহীন * .py ফাইলটি খুলুন:

/usr/lib/python2.5/string.py

প্রদত্ত এপিআই থেকে ব্যতিক্রম উত্থাপিত বিষয়গুলি আবিষ্কার করতে আমি এটি অবিশ্বাস্যভাবে দরকারী বলে খুঁজে পেয়েছি। পাইথন বিশ্বে এই ধরণের বিশদটি খুব কমই ডকুমেন্টেড।


7

যদিও pprintঅন্যদের দ্বারা ইতিমধ্যে উল্লেখ করা হয়েছে আমি কিছু প্রসঙ্গ যুক্ত করতে চাই।

পিপ্রিন্ট মডিউলটি একটি ফর্মের মধ্যে "সুন্দর-মুদ্রণ" স্বেচ্ছাসেবক পাইথন ডেটা স্ট্রাকচারের সক্ষমতা সরবরাহ করে যা দোভাষীর ইনপুট হিসাবে ব্যবহার করা যেতে পারে। যদি ফর্ম্যাট স্ট্রাকচারগুলিতে এমন বস্তু অন্তর্ভুক্ত থাকে যা মৌলিক পাইথন ধরণের নয়, তবে উপস্থাপনাটি লোডযোগ্য নাও হতে পারে। ফাইল, সকেট, ক্লাস, বা উদাহরণস্বরূপ অবজেক্টগুলির পাশাপাশি অনেকগুলি বিল্ট-ইন অবজেক্টগুলি পাইথন কনস্ট্যান্ট হিসাবে প্রতিনিধিত্বযোগ্য নয় এমন ক্ষেত্রে এটি হতে পারে।

pprintএমন কোনও পিএইচপি ব্যাকগ্রাউন্ড সহ বিকাশকারীদের উচ্চ-চাহিদা হতে পারে যারা এর বিকল্প খুঁজছেন var_dump()

একটি অভি অ্যাট্রিবিউটের সাথে বস্তু ব্যবহার করে চমত্কারভাবে ডাম্প করা যেতে পারে pprint()সঙ্গে মিশ্রিত করা vars()হয়, যা ফেরৎ __dict__একটি মডিউল, বর্গ, উদাহরণস্বরূপ, ইত্যাদি জন্য গুণাবলীর .:

from pprint import pprint
pprint(vars(your_object))

সুতরাং, লুপের প্রয়োজন নেই

গ্লোবাল বা স্থানীয় স্কোপে থাকা সমস্ত ভেরিয়েবলগুলি ডাম্প করতে কেবল ব্যবহার করুন:

pprint(globals())
pprint(locals())

locals()একটি ফাংশনে সংজ্ঞায়িত ভেরিয়েবলগুলি দেখায়। অন্যান্য ব্যবহারের
মধ্যে স্ট্রিং কী হিসাবে তাদের সংশ্লিষ্ট নামের সাথে ফাংশনগুলি অ্যাক্সেস করতে এটি দরকারী :

locals()['foo']() # foo()
globals()['foo']() # foo()

একইভাবে, ব্যবহার dir() কোনও মডিউলের বিষয়বস্তু বা কোনও অবজেক্টের বৈশিষ্ট্যগুলি দেখতে ।

এবং এখনও আরও আছে।


4

আপনি যদি প্যারামিটার এবং পদ্ধতিগুলি দেখতে চান তবে অন্যরা যেমন নির্দেশ করেছে আপনি ভাল ব্যবহার করতে পারেন pprintবাdir()

আপনি যদি বিষয়বস্তুর প্রকৃত মান দেখতে চান তবে আপনি এটি করতে পারেন

object.__dict__


4

কোড পরিদর্শন করার জন্য দুটি দুর্দান্ত সরঞ্জাম হ'ল:

  1. IPython । একটি অজগর টার্মিনাল যা আপনাকে ট্যাব সমাপ্তি ব্যবহার করে পরিদর্শন করতে দেয়।

  2. পাইডেভ প্লাগইন সহ গ্রহন করুন । এটিতে একটি দুর্দান্ত ডিবাগার রয়েছে যা আপনাকে কোনও নির্দিষ্ট স্থানে ভাঙ্গতে এবং গাছের মতো সমস্ত ভেরিয়েবল ব্রাউজ করে অবজেক্টগুলি পরীক্ষা করতে দেয়। এমনকি আপনি সেই স্থানে কোড চেষ্টা করতে বা বস্তুটি টাইপ করতে এম্বেড থাকা টার্মিনালটি ব্যবহার করতে পারেন এবং 'টিপুন।' এটি আপনার জন্য কোড ইঙ্গিত দেয় have

এখানে চিত্র বর্ণনা লিখুন




3

আপনি যদি বিষয়টির সাথে সম্পর্কিত ফাংশনের উত্স কোডটি দেখতে আগ্রহী হন তবে আপনি myobjটাইপ করতে পারেন iPythonবা Jupyter Notebook:

myobj??


2
import pprint

pprint.pprint(obj.__dict__)

অথবা

pprint.pprint(vars(obj))

যদিও এই কোডটি প্রশ্নের উত্তর দিতে পারে, কীভাবে এবং / বা কেন এটি সমস্যার সমাধান করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করলে উত্তরের দীর্ঘমেয়াদী মান উন্নত হবে।
আলেকজান্ডার

1

আপনি যদি কোনও লাইভ অবজেক্টের ভিতরে দেখতে চান তবে অজগরটির inspectমডিউলটি একটি ভাল উত্তর। সাধারণভাবে, এটি ডিস্কের কোথাও কোনও উত্স ফাইলে সংজ্ঞায়িত ফাংশনগুলির উত্স কোড পাওয়ার জন্য কাজ করে। আপনি লাইভ কার্যকারিতা ও lambdas উৎস যে ব্যাখ্যাকারী সংজ্ঞায়িত করা হয়েছে পেতে চান, আপনি ব্যবহার করতে পারেন dill.source.getsourceথেকে dill। এটি সীমাবদ্ধ বা আনবাউন্ড শ্রেণি পদ্ধতি এবং কারিগুলিতে সংজ্ঞায়িত ফাংশনগুলির জন্য কোডও পেতে পারে ... তবে, আপনি কোডটি সংযুক্তকারী বস্তুর কোড ব্যতীত সংকলন করতে সক্ষম হতে পারবেন না।

>>> from dill.source import getsource
>>> 
>>> def add(x,y):
...   return x+y
... 
>>> squared = lambda x:x**2
>>> 
>>> print getsource(add)
def add(x,y):
  return x+y

>>> print getsource(squared)
squared = lambda x:x**2

>>> 
>>> class Foo(object):
...   def bar(self, x):
...     return x*x+x
... 
>>> f = Foo()
>>> 
>>> print getsource(f.bar)
def bar(self, x):
    return x*x+x

>>> 


0

এছাড়াও আপনি যদি তালিকা এবং অভিধানের ভিতরে সন্ধান করতে চান তবে আপনি প্রিন্ট () ব্যবহার করতে পারেন


0

ইতিমধ্যে অনেকগুলি ভাল টিপস রয়েছে তবে সবচেয়ে সংক্ষিপ্ততম এবং সহজতম (প্রয়োজনীয়টি সেরা নয়) এখনও উল্লেখ করা যায়নি:

object?

-3

ব্যবহার করার চেষ্টা করুন:

print(object.stringify())
  • objectআপনি যে বস্তুর পরিদর্শন করার চেষ্টা করছেন তার পরিবর্তনশীল নাম কোথায় ।

এটি একটি দুর্দান্ত বিন্যাসিত এবং ট্যাবড আউটপুট প্রিন্ট করে যা বস্তুর কী এবং মানগুলির সমস্ত শ্রেণিবিন্যাস দেখায়।

দ্রষ্টব্য: এটি অজগর 3 এ কাজ করে। এটি পূর্ববর্তী সংস্করণগুলিতে কাজ করে কিনা তা নিশ্চিত নয়

আপডেট: এটি সমস্ত ধরণের অবজেক্টে কাজ করে না। যদি আপনি এই ধরণের কোনওটির (মুখোমুখি অনুরোধের মতো) মুখোমুখি হন তবে পরিবর্তে নিম্নলিখিতগুলির একটি ব্যবহার করুন:

  • dir(object())

অথবা

import pprint তারপর: pprint.pprint(object.__dict__)


1
'অনুরোধ' অবজেক্টে কাজ করে না '' রিকোয়েস্ট 'অবজেক্টটির' স্ট্রিংফাইটি 'কোনও বৈশিষ্ট্য নেই
AlxVallejo
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.