파이썬 (Django 웹 개발 및 Panda3D 게임 개발 포함)을 사용하여 다양한 프로젝트에서 코딩을 시작하고 있습니다.
무슨 일이 일어나고 있는지 이해하도록 돕기 위해 기본적으로 Python 객체 내부에서 '보기'를 사용하여 메소드 및 속성과 같은 눈금을 확인하고 싶습니다.
파이썬 객체가 있다고 가정하면 그 내용을 인쇄하려면 무엇이 필요합니까? 가능합니까?
파이썬 (Django 웹 개발 및 Panda3D 게임 개발 포함)을 사용하여 다양한 프로젝트에서 코딩을 시작하고 있습니다.
무슨 일이 일어나고 있는지 이해하도록 돕기 위해 기본적으로 Python 객체 내부에서 '보기'를 사용하여 메소드 및 속성과 같은 눈금을 확인하고 싶습니다.
파이썬 객체가 있다고 가정하면 그 내용을 인쇄하려면 무엇이 필요합니까? 가능합니까?
답변:
object.__dict__
vars(object)
그것을 위해 만들어졌습니다.
from pprint import pprint; pprint(vars(object))
제 물체의 내용을 정말 잘 볼 수있었습니다. 감사합니다 @liberforce
먼저 소스를 읽으십시오.
둘째, 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 모듈을 사용합니다.
쉘에서 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__
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
)
다른 사람들은 이미 찾고있는 것처럼 들리는 dir () 내장을 언급했지만 여기 또 다른 좋은 팁이 있습니다. 대부분의 표준 라이브러리를 포함한 많은 라이브러리는 소스 형식으로 배포됩니다. 즉, 소스 코드를 직접 쉽게 읽을 수 있습니다. 트릭은 그것을 찾는 것입니다. 예를 들면 다음과 같습니다.
>>> import string
>>> string.__file__
'/usr/lib/python2.5/string.pyc'
* .pyc 파일은 컴파일되므로 후행 'c'를 제거하고 선호하는 편집기 또는 파일 뷰어에서 컴파일되지 않은 * .py 파일을여십시오.
/usr/lib/python2.5/string.py
주어진 API에서 어떤 예외가 발생하는지 발견하는 데 매우 유용합니다. 이런 종류의 세부 사항은 파이썬 세계에서 거의 잘 문서화되어 있지 않습니다.
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__
코드 검사를위한 두 가지 훌륭한 도구는 다음과 같습니다.
IPython . 탭 완성을 사용하여 검사 할 수있는 파이썬 터미널.
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)는 객체의 속성을 반환합니다.
다음을 사용하십시오.
print(object.stringify())
object
검사하려는 객체의 변수 이름은 어디에 있습니까 ?이것은 객체의 모든 키와 값의 계층을 보여주는 형식이 좋고 탭이있는 출력을 인쇄합니다.
참고 : 이것은 python3에서 작동합니다. 이전 버전에서 작동하는지 확실하지 않습니다
업데이트 : 모든 유형의 객체에서 작동하지는 않습니다. 이러한 유형 중 하나 (예 : Request 객체)가 발생하면 대신 다음 중 하나를 사용하십시오.
dir(object())
또는
import pprint
그때:
pprint.pprint(object.__dict__)