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


291

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

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

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

답변:


352

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

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

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


25
용어가 '내성'이라는 것을 몰랐다. 큰 도움이됩니다! 당신이 저에게 준 모든 기능들과 마찬가지로 ... 감사합니다!
littlejim84 2016 년

2
property, classmethod 및 staticmethod는 내부 검사와 관련이 없습니다. 이러한 메소드는 모두 특수한 동작을 가진 클래스를 정의하는 데 사용할 수있는 특수한 유형의 객체를 생성하지만 해당 클래스 나 구문을 검사하는 데는 도움이되지 않습니다.
SingleNegationElimination

아래 @Brian의 답변은 파이썬 내에서 다양한 파이썬 객체의 소스 코드를 보는 방법을 보여줍니다. 그것이 내가 처음 찾던 것이었고, 나는 혼자가 아닐 것이라고 확신합니다. (가장 많이 받아 들여
지므로이

파이썬 용 내장 "IntelliSense" 와 같습니다 . 나는 그것을 좋아한다.
Bruno Bieri

7
나는 그 나쁜 대답을 생각합니다. 우리에게 해결책을 제공하는 대신 그것은 단지 우리에게 문서에있는 것과 관련된 모든 것을 제공합니다
Ishan Srivastava

176

object.__dict__


12
vars(object)그것을 위해 만들어졌습니다.
liberforce 2018

6
사실 from pprint import pprint; pprint(vars(object))제 물체의 내용을 정말 잘 볼 수있었습니다. 감사합니다 @liberforce
N. Maks

가장 좋은 방법은 문자열 객체와 그 내용을 볼 수
피터 크라우스에게

이것은 표현 방법을 구현하는 객체 또는 googleapiclient.errors.HttpError와 같은 객체를 볼 수있는 좋은 방법입니다. 인쇄 할 때 불충분 한 정보를 인쇄합니다. @ mtasic85
Felipe Valdes

65

먼저 소스를 읽으십시오.

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


92
나는 그 순서를 반대로 바꾸겠다.
bayer

5
소스는 dir ()보다 유익하고 개발 습관이 더 좋습니다.
S.Lott

14
나는달라고 간청한다. dir ()은 훨씬 빠르며 99 %의 경우 help ()와 함께 필요한 것을 찾을 수 있습니다.
bayer

7
나는 보통 쓸모없는 것에 동의합니다. 많은 시간 동안 dir ()에 대한 간단한 호출만으로 충분하므로 소스 코드를 살펴보아야하는 번거 로움을 덜어줍니다.
Sasha Chedygov

3
때때로 런타임에 객체를 검사하는 것이 유용 할 수 있지만 소스를 읽는 것은 아닙니다. 예를 들어 httplib.py 클래스 및 해당 메소드 :).
Denis Barmenkov

61

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

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

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

foo()
    foo!

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


그런 다음 여기에 언급 된 다른 기술을 사용하십시오. 그러나 docstring이 사용 가능한 경우 캐논을 고려하십시오.
Edward Falk

파이썬이 지난 몇 년 동안이 기능을 업데이트했는지 확실하지 않지만 "help (object_name)"은 고도로 구조화 된 형식으로 전체 개요를 제공합니다. 골키퍼입니다. 감사.
브라이언 Cugelman

27

이것이 무슨 일이 일어나고 있는지 알아보기 위해 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 함수 매개 변수의 이름과 기본값을 제공하므로 랩핑 또는 조작 함수를 다루는 경우에도 유용합니다.


18

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

objbrowser 스크린 샷


9

쉘에서 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


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에서 잘 작동합니다.
ConstantineK

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

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

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

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

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

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


7

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()모듈의 내용이나 객체의 속성을 보는 데 사용합니다.

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


4

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

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

object.__dict__


4

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

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

  2. PyDev 플러그인 이있는 Eclipse . 지정된 위치에서 중단하고 모든 변수를 트리로 찾아 객체를 검사 할 수있는 뛰어난 디버거가 있습니다. 내장 된 터미널을 사용하여 해당 지점에서 코드를 시도하거나 객체를 입력하고 '를'눌러도됩니다. 코드 힌트를 제공합니다.

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



3

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


3

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

myobj??


2
import pprint

pprint.pprint(obj.__dict__)

또는

pprint.pprint(vars(obj))

이 코드는 질문에 대답 할 수 있지만 문제를 해결하는 방법 및 / 또는 이유 에 대한 추가 컨텍스트를 제공 하면 답변의 장기적인 가치가 향상됩니다.
Alexander

1

라이브 객체 내부를보고 싶다면 파이썬 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

>>> 



0

많은 좋은 팁이 이미 있지만 가장 짧고 가장 쉬운 것은 아니지만 반드시 언급되지 않았습니다.

object?

-3

다음을 사용하십시오.

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

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

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

업데이트 : 모든 유형의 객체에서 작동하지는 않습니다. 이러한 유형 중 하나 (예 : Request 객체)가 발생하면 대신 다음 중 하나를 사용하십시오.

  • dir(object())

또는

import pprint 그때: pprint.pprint(object.__dict__)


1
'Request'객체에서 작동하지 않습니다 " 'Request'객체에 'stringify'속성이 없습니다"
AlxVallejo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.