[python] 객체의 모든 현재 속성과 값을 인쇄하는 내장 함수가 있습니까?

그래서 내가 찾고있는 것은 PHP의 print_r 함수 와 같은 것 입니다.

이것은 해당 객체의 상태를 확인하여 스크립트를 디버깅 할 수 있도록합니다.



답변

당신은 정말로 두 가지 다른 것을 섞고 있습니다.

사용 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__'}


답변

당신은 다음과 vars()혼합 되기를 원합니다 pprint():

from pprint import pprint
pprint(vars(your_object))


답변

def dump(obj):
  for attr in dir(obj):
    print("obj.%s = %r" % (attr, getattr(obj, attr)))

예외 처리, 국가 / 특수 문자 인쇄, 중첩 된 객체로의 반복 등의 기능을 작성자의 선호도에 따라 추가하는 많은 타사 기능이 있습니다. 그러나 그들은 기본적으로 이것으로 귀결됩니다.


답변

dir 이 언급되었지만 속성 이름 만 제공합니다. 그들의 가치를 원한다면 __dict__를 시도하십시오.

class O:
   def __init__ (self):
      self.value = 3

o = O()

출력은 다음과 같습니다.

>>> o.__dict__

{'value': 3}


답변

“dir ()”함수를 사용하여이를 수행 할 수 있습니다.

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


답변

객체의 현재 상태를 인쇄하려면 다음을 수행하십시오.

>>> obj # in an interpreter

또는

print repr(obj) # in a script

또는

print obj

클래스 정의 __str__또는 __repr__메소드. 로부터 파이썬 문서 :

__repr__(self)repr()내장 함수와 문자열 변환 (역 따옴표)에 의해 호출되어 객체의 “공식적인”문자열 표현을 계산합니다. 가능한 경우 이것은 동일한 값을 가진 객체를 다시 만드는 데 사용할 수있는 유효한 Python 표현식처럼 보일 것입니다 (적절한 환경이 제공됨). 이것이 가능하지 않으면 “<… some useful description …>”형식의 문자열이 반환되어야합니다. 반환 값은 문자열 객체 여야합니다. 클래스가 정의 경우 에 repr ()하지만 __str__(), 그 __repr__()클래스의 인스턴스의 “비공식”문자열 표현이 필요한 경우에도 사용됩니다. 일반적으로 디버깅에 사용되므로 표현이 풍부하고 모호하지 않은 표현이 중요합니다.

__str__(self)str()내장 함수와 print 문에 의해 호출되어 객체의 “비공식”문자열 표현을 계산합니다. 이것은 __repr__()유효한 파이썬 표현식 일 필요는 없다는 점과 다릅니다 . 대신에보다 편리하거나 간결한 표현이 사용될 수 있습니다. 반환 값은 문자열 객체 여야합니다.


답변

체크 아웃 할 가치가있을 수 있습니다.

Perl의 Data :: Dumper에 해당하는 Python이 있습니까?

내 추천은 이것입니다-

https://gist.github.com/1071857

perl은 객체 데이터를 다시 perl 소스 코드로 변환하는 Data :: Dumper라는 모듈을 가지고 있습니다 (NB : 코드를 다시 소스로 변환하지 않으며 거의 ​​항상 출력에서 ​​객체 메소드 함수를 원하지 않습니다). 이것은 지속성을 위해 사용될 수 있지만 일반적인 목적은 디버깅입니다.

표준 python pprint가 달성하지 못하는 많은 것들이 있습니다. 특히 객체의 인스턴스를 볼 때 내림차순으로 멈추고 객체의 내부 16 진수 포인터를 제공합니다 (오류, 포인터는별로 사용되지 않습니다) 방법). 간단히 말해, 파이썬은이 위대한 객체 지향 패러다임에 관한 것입니다.

perl Data :: Dumper를 사용하면 원하는 깊이를 제어 할 수 있으며 순환 연결된 구조도 감지 할 수 있습니다 (정말 중요 함). 이 과정은 기본적으로 펄에서 달성하기가 더 쉽습니다. 왜냐하면 객체는 축복을 넘어서는 특별한 마법이 없기 때문입니다 (일반적으로 잘 정의 된 과정).