development

파이썬 객체를 어떻게 보나요?

big-blog 2020. 4. 1. 08:01
반응형

파이썬 객체를 어떻게 보나요?


Python (Django 웹 개발 및 Panda3D 게임 개발 포함)을 사용하여 다양한 프로젝트에서 코딩을 시작하고 있습니다.

무슨 일이 일어나고 있는지 이해하도록 돕기 위해 기본적으로 Python 객체 내부에서 '보기'를 사용하여 메소드 및 속성과 같은 눈금을 확인하고 싶습니다.

파이썬 객체가 있다고 가정하면 그 내용을 인쇄하려면 무엇이 필요합니까? 가능합니까?


파이썬에는 강력한 내부 검사 기능이 있습니다.

다음과 같은 내장 함수를 살펴보십시오 .

type()dir()물체의 종류와 각각의 속성의 설정, 검사에 특히 유용하다.


object.__dict__


먼저 소스를 읽으십시오.

둘째, dir()기능을 사용하십시오 .


아직 아무도 언급하지 않은 도움에 놀랐습니다!

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

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

foo()
    foo!

도움말을 통해 docstring을 읽고 클래스에 어떤 속성이 있는지 알 수 있습니다. 이는 매우 유용합니다.


이것이 무슨 일이 일어나고 있는지 알아보기 위해 IPython을 보는 것이 좋습니다 . 이것은 객체 문서, 속성 및 소스 코드를 얻기위한 다양한 단축키를 추가합니다. 예를 들어 "?"를 추가하면 함수를 사용하면 객체에 대한 도움말을 제공합니다 ( "help (obj)"에 대한 바로 가기). 두 개의? ( " func??")를 사용하면 소스 코드를 사용할 수있는 경우 표시됩니다.

또한 탭 완성, 결과의 예쁜 인쇄, 결과 기록 등과 같은 추가 편의 기능도 많이있어 이러한 종류의 탐색 적 프로그래밍에 매우 편리합니다.

반성의 많은 프로그램 사용을 위해 기본 내장 매크로 좋아 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 함수 매개 변수의 이름과 기본값을 제공하므로 함수 줄 바꿈 또는 조작을 처리하는 경우에도 유용합니다.


이를 위해 GUI에 관심이 있다면 objbrowser를 살펴보십시오 . 아래의 객체 내부 검사를 위해 Python 표준 라이브러리의 inspect 모듈을 사용합니다.

objbrowser 스크린 샷


쉘에서 dir ()을 사용하여 객체의 속성을 나열 할 수 있습니다.

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

물론 inspect 모듈도 있습니다 : http://docs.python.org/library/inspect.html#module-inspect


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

다른 사람들은 이미 찾고있는 것처럼 들리는 dir () 내장을 언급했지만 여기 또 다른 좋은 팁이 있습니다. 대부분의 표준 라이브러리를 포함한 많은 라이브러리는 소스 형식으로 배포됩니다. 즉, 소스 코드를 직접 쉽게 읽을 수 있습니다. 트릭은 그것을 찾는 것입니다. 예를 들면 다음과 같습니다.

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

* .pyc 파일은 컴파일되므로 후행 'c'를 제거하고 선호하는 편집기 또는 파일 뷰어에서 컴파일되지 않은 * .py 파일을여십시오.

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

주어진 API에서 어떤 예외가 발생했는지 발견하는 데 매우 유용합니다. 이런 종류의 세부 사항은 파이썬 세계에서 거의 잘 문서화되어 있지 않습니다.


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
)

pprint다른 사람들이 이미 언급 했지만 문맥을 추가하고 싶습니다.

pprint 모듈은 임의의 Python 데이터 구조를 인터프리터에 대한 입력으로 사용할 수있는 형태로 "예쁜 인쇄"기능을 제공합니다. 형식이 지정된 구조에 기본 Python 유형이 아닌 객체가 포함 된 경우 표현을로드 할 수 없습니다. 파일, 소켓, 클래스 또는 인스턴스와 같은 객체와 Python 상수로 표현할 수없는 다른 내장 객체가 포함 된 경우가 이에 해당합니다.

pprint에 대한 대안을 찾고있는 PHP 배경 지식을 가진 개발자는 수요가 많을 수 있습니다 var_dump().

dict 속성을 가진 객체는 pprint()mixed with를 사용하여 멋지게 덤프 할 수 있습니다 . 모듈, 클래스, 인스턴스 등에 대한 속성을 vars()반환합니다 __dict__.

from pprint import pprint
pprint(vars(your_object))

따라서 루프가 필요하지 않습니다 .

전역 또는 로컬 범위에 포함 된 모든 변수를 덤프하려면 다음을 사용하십시오.

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

locals()함수에 정의 된 변수를 보여줍니다. 다른 사용법
중에서도 해당 이름을 문자열 키로 사용하여 함수에 액세스하는 것이 유용합니다 .

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

마찬가지로 dir()모듈의 내용이나 객체의 속성을 보는 데 사용합니다.

그리고 여전히 더 있습니다.


다른 사람들이 지적했듯이 매개 변수와 메소드를보고 싶다면 잘 사용 pprint하거나dir()

내용의 실제 가치를보고 싶다면 할 수 있습니다

object.__dict__


pprint와 dir은 함께 작동합니다


이 목적을 위해 파이썬 코드 라이브러리 빌드가 있습니다 : inspect Python 2.7에서 소개되었습니다.


코드 검사를위한 두 가지 훌륭한 도구는 다음과 같습니다.

  1. IPython . 탭 완성을 사용하여 검사 할 수있는 파이썬 터미널.

  2. PyDev 플러그인 이있는 Eclipse . 주어진 지점에서 깨고 모든 변수를 트리로 탐색하여 객체를 검사 할 수있는 훌륭한 디버거가 있습니다. 내장 된 터미널을 사용하여 해당 지점에서 코드를 시도하거나 객체를 입력하고 '를'눌러도됩니다. 코드 힌트를 제공합니다.

여기에 이미지 설명을 입력하십시오


라이브 객체 내부를보고 싶다면 파이썬 inspect모듈이 좋은 대답입니다. 일반적으로 디스크의 소스 파일에 정의 된 함수의 소스 코드를 가져 오는 데 사용됩니다. 인터프리터에 정의 된 라이브 기능과 람다의 소스를 얻고 싶은 경우에, 당신은 사용할 수 있습니다 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

>>> 

vars (obj)는 객체의 속성을 반환합니다.


import pprint

pprint.pprint(obj.__dict__)

또는

pprint.pprint(vars(obj))

당신은 객체에 해당하는 함수의 소스 코드를보고 관심이 있다면 myobj, 당신은 입력 할 수 있습니다 iPython또는 Jupyter Notebook:

myobj??


또한리스트와 사전을 살펴보고 싶다면 pprint ()


다음을 사용하십시오.

print(object.stringify())
  • object검사하려는 객체의 변수 이름은 어디에 있습니까 ?

이것은 객체의 모든 키와 값의 계층을 보여주는 형식이 좋고 탭이있는 출력을 인쇄합니다.

참고 : 이것은 python3에서 작동합니다. 이전 버전에서 작동하는지 확실하지 않습니다

참고 URL : https://stackoverflow.com/questions/1006169/how-do-i-look-inside-a-python-object

반응형