답변:
당신은 정말로 두 가지 다른 것을 섞고 있습니다.
사용 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__'}
print re.compile(r'slots').search('No slots here either.').__slots__
inspect
대답 에 모듈에 대해 더 이야기하지 않습니까? 나는 그것이 print_r 또는 var_dump에 가장 가까운 것이라고 생각합니다.
dir()
합니까? dir()
이름의 목록 만 반환하며 모든 이름 vars()
이 __dict__
속성 에 있거나 속성 에있는 것은 아닙니다 .
당신은 다음과 vars()
혼합 되기를 원합니다 pprint()
:
from pprint import pprint
pprint(vars(your_object))
dir()
당신은 모든 당신이 아마 같은 신경 쓰지 않는 것들에 내장 제공 __str__
하고 __new__
. var()
하지 않습니다.
__dict__
속성 이없는 세트 및 기타 객체에서는 실패 합니다.
def dump(obj):
for attr in dir(obj):
print("obj.%s = %r" % (attr, getattr(obj, attr)))
예외 처리, 국가 / 특수 문자 인쇄, 중첩 된 객체로의 반복 등의 기능을 작성자의 선호도에 따라 추가하는 많은 타사 기능이 있습니다. 그러나 그들은 기본적으로 이것으로 귀결됩니다.
getmembers()
표준 inspect
모듈에서이 기능을 사용할 수는 있지만 일반적으로 내부 검사를 수행하는 방법을 설명하는 데 더 유용하다고 생각했습니다.
__dict__
(예 : __doc__
및 __module__
)을 보여줍니다 . 또한로 __dict__
선언 된 객체에는 전혀 작동하지 않습니다 __slots__
. 일반적으로 __dict__
실제로 사전에 실제로 저장된 사용자 수준 속성을 보여줍니다. dir () 더 보여줍니다.
__dict__
속성 / 구성원이 포함되어 있지 않습니다 . 나는 그것이 미쳤다는 것을 알고 있지만 사실이다. 같은 내장 기능 int
및 str
또는 re.MatchObject
의 일반적인 예입니다. 시도 'hello'.__dict__
후 시도dir('hello')
dir 이 언급되었지만 속성 이름 만 제공합니다. 그들의 가치를 원한다면 __dict__를 시도하십시오.
class O:
def __init__ (self):
self.value = 3
o = O()
출력은 다음과 같습니다.
>>> o.__dict__
{'value': 3}
set
가 없기 __dict__
때문에 실패 할 것입니다AttributeError: 'set' object has no attribute '__dict__'
"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__()
유효한 파이썬 표현식 일 필요는 없다는 점과 다릅니다 . 대신에보다 편리하거나 간결한 표현이 사용될 수 있습니다. 반환 값은 문자열 객체 여야합니다.
print "DEBUG: object value: " + repr(obj)
체크 아웃 할 가치가있을 수 있습니다.
Perl의 Data :: Dumper에 해당하는 Python이 있습니까?
내 추천은 이것입니다-
https://gist.github.com/1071857
perl은 객체 데이터를 다시 perl 소스 코드로 변환하는 Data :: Dumper라는 모듈을 가지고 있습니다 (NB : 코드를 다시 소스로 변환하지 않으며 거의 항상 출력에서 객체 메소드 함수를 원하지 않습니다). 이것은 지속성을 위해 사용될 수 있지만 일반적인 목적은 디버깅입니다.
표준 python pprint가 달성하지 못하는 많은 것들이 있습니다. 특히 객체의 인스턴스를 볼 때 내림차순으로 멈추고 객체의 내부 16 진수 포인터를 제공합니다 (오류, 포인터는별로 사용되지 않습니다) 방법). 간단히 말해, 파이썬은이 위대한 객체 지향 패러다임에 관한 것입니다.
perl Data :: Dumper를 사용하면 원하는 깊이를 제어 할 수 있으며 순환 연결된 구조도 감지 할 수 있습니다 (정말 중요 함). 이 과정은 기본적으로 펄에서 달성하기가 더 쉽습니다. 왜냐하면 객체는 축복을 넘어서는 특별한 마법이 없기 때문입니다 (일반적으로 잘 정의 된 과정).
을 사용하는 것이 좋습니다 help(your_object)
.
help(dir)
If called without an argument, return the names in the current scope. Else, return an alphabetized list of names comprising (some of) the attributes of the given object, and of attributes reachable from it. If the object supplies a method named __dir__, it will be used; otherwise the default dir() logic is used and returns: for a module object: the module's attributes. for a class object: its attributes, and recursively the attributes of its bases. for any other object: its attributes, its class's attributes, and recursively the attributes of its class's base classes.
help(vars)
Without arguments, equivalent to locals(). With an argument, equivalent to object.__dict__.
대부분의 경우, 사용 __dict__
또는 dir()
당신이 원하는하고있는 정보를 얻을 것이다. 더 자세한 정보가 필요한 경우 표준 라이브러리에는 inspect 모듈이 포함되어있어 매우 세부적인 정보 를 얻을 수 있습니다. 가장 많은 정보 중 일부는 다음과 같습니다.
당신은 단지를 찾고 있다면 "내 목적은 무엇 속성 값을 가질 수 있는가?", 다음 dir()
과 __dict__
아마 충분하다. 임의의 객체의 현재 상태를 실제로 파고 싶다면 (파이썬에서는 거의 모든 것이 객체라는 것을 명심하십시오), inspect
고려할 가치가 있습니다.
객체의 모든 현재 속성과 값을 인쇄하는 내장 함수가 있습니까?
아니요. 가장 많이 찬성 된 답변에는 일부 속성이 제외되며 승인 된 답변은 비공개 API의 메소드 및 부분을 포함하여 모든 속성 을 얻는 방법을 보여줍니다 . 그러나 이것에 대한 완벽한 내장 기능 은 없습니다 .
따라서 짧은 결론은 자신이 직접 작성할 수 있지만 공개 API의 일부인 속성 및 기타 계산 된 데이터 설명자를 계산하므로 다음과 같이 원하지 않을 수 있습니다.
from pprint import pprint
from inspect import getmembers
from types import FunctionType
def attributes(obj):
disallowed_names = {
name for name, value in getmembers(type(obj))
if isinstance(value, FunctionType)}
return {
name: getattr(obj, name) for name in dir(obj)
if name[0] != '_' and name not in disallowed_names and hasattr(obj, name)}
def print_attributes(obj):
pprint(attributes(obj))
다양한 종류의 데이터 멤버가있는 클래스에서 현재 가장 많이 투표 된 답변을 적용하는 것을 관찰하십시오.
from pprint import pprint
class Obj:
__slots__ = 'foo', 'bar', '__dict__'
def __init__(self, baz):
self.foo = ''
self.bar = 0
self.baz = baz
@property
def quux(self):
return self.foo * self.bar
obj = Obj('baz')
pprint(vars(obj))
인쇄 만 :
{'baz': 'baz'}
때문에 vars
단지가 을 반환 __dict__
객체의, 그리고 당신이 바르에 의해 반환 된 DICT을 수정 그렇다면, 복사 아니라, 당신은 또한 수정하고 __dict__
개체 자체의를.
vars(obj)['quux'] = 'WHAT?!'
vars(obj)
보고:
{'baz': 'baz', 'quux': 'WHAT?!'}
-quux는 우리가 설정해서는 안되고 네임 스페이스에 있으면 안되는 속성이기 때문에 좋지 않습니다 ...
현재 허용되는 답변 (및 기타)에 조언을 적용하는 것이 그리 좋지 않습니다.
>>> dir(obj)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', 'bar', 'baz', 'foo', 'quux']
보시다시피 , 객체와 관련된 모든 이름 (실제로는 거의 대부분) dir
만 반환 합니다.
inspect.getmembers
주석에 언급 된 것과 마찬가지로 결함이 있습니다. 모든 이름 과 값을 반환 합니다.
가르 칠 때 학생들에게 의미 적으로 공개적으로 객체의 API를 제공하는 함수를 만들게합니다.
def api(obj):
return [name for name in dir(obj) if name[0] != '_']
객체의 시맨틱 네임 스페이스의 복사본 을 제공하기 위해이를 확장 할 수 있지만 __slots__
할당되지 않은 것을 제외해야 하며 "현재 속성"에 대한 요청을 심각하게 받아들이는 경우 계산 된 속성을 제외해야합니다. 그들은 비쌀 수 있고 "현재"가 아닌 것으로 해석 될 수있다) :
from types import FunctionType
from inspect import getmembers
def attrs(obj):
disallowed_properties = {
name for name, value in getmembers(type(obj))
if isinstance(value, (property, FunctionType))}
return {
name: getattr(obj, name) for name in api(obj)
if name not in disallowed_properties and hasattr(obj, name)}
그리고 이제 quux 속성을 계산하거나 표시하지 않습니다.
>>> attrs(obj)
{'bar': 0, 'baz': 'baz', 'foo': ''}
그러나 아마도 우리는 우리의 재산이 비싸지 않다는 것을 알고 있습니다. 논리를 포함하도록 논리를 변경하고 싶을 수도 있습니다. 또한 다른 사용자 지정 데이터 설명자를 제외하고 싶을 수도 있습니다.
그런 다음이 기능을 추가로 사용자 정의해야합니다. 그래서 우리가 원하는 것을 정확하게 알고 마법으로 제공하는 내장 함수를 가질 수 없다는 것이 합리적입니다. 이것은 우리 자신을 만드는 데 필요한 기능입니다.
이를 수행하는 기본 제공 기능이 없으므로 상황에 가장 의미 적으로 적합한 것을 수행해야합니다.
FunctionType
있습니다. 그러나 매우 도움이되었습니다-감사합니다!
메타 프로그래밍 예제 마술로 덤프 객체 :
$ 고양이 dump.py
#!/usr/bin/python
import sys
if len(sys.argv) > 2:
module, metaklass = sys.argv[1:3]
m = __import__(module, globals(), locals(), [metaklass])
__metaclass__ = getattr(m, metaklass)
class Data:
def __init__(self):
self.num = 38
self.lst = ['a','b','c']
self.str = 'spam'
dumps = lambda self: repr(self)
__str__ = lambda self: self.dumps()
data = Data()
print data
인수없이 :
$ python dump.py
<__main__.Data instance at 0x00A052D8>
와 영적 인식의 Utils :
$ python dump.py gnosis.magic MetaXMLPickler
<?xml version="1.0"?>
<!DOCTYPE PyObject SYSTEM "PyObjects.dtd">
<PyObject module="__main__" class="Data" id="11038416">
<attr name="lst" type="list" id="11196136" >
<item type="string" value="a" />
<item type="string" value="b" />
<item type="string" value="c" />
</attr>
<attr name="num" type="numeric" value="38" />
<attr name="str" type="string" value="spam" />
</PyObject>
조금 구식이지만 여전히 작동합니다.
이것을 디버깅에 사용하고 모든 것의 재귀 덤프를 원한다면 클래스에 __str__
이미 좋은 구현 이 필요하기 때문에 허용되는 대답은 만족스럽지 않습니다 . 그렇지 않은 경우 훨씬 효과적입니다.
import json
print(json.dumps(YOUR_OBJECT,
default=lambda obj: vars(obj),
indent=1))
TypeError: vars() argument must have __dict__ attribute
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(), show_protected=True, show_static=True, show_properties=True)
산출:
__main__.A(_p = 8, foo = [0, 1, ..., 8, 9], s = 5)
그러면 모든 객체 내용이 json 또는 yaml 들여 쓰기 형식으로 재귀 적으로 인쇄됩니다.
import jsonpickle # pip install jsonpickle
import json
import yaml # pip install pyyaml
serialized = jsonpickle.encode(obj, max_depth=2) # max_depth is optional
print json.dumps(json.loads(serialized), indent=4)
print yaml.dump(yaml.load(serialized), indent=4)
나는 pprint 만 언급하는 대답을 상향 조정했습니다. 복잡한 데이터 구조의 모든 값 을 보려면 다음과 같이하십시오.
from pprint import pprint
pprint(my_var)
여기서 my_var 는 관심 변수입니다. 내가 사용했을 때 pprint(vars(my_var))
아무것도 얻지 못했고 여기에 다른 답변이 도움이되지 않았거나 방법이 불필요하게 길어 보였습니다. 그건 그렇고, 내 특별한 경우, 내가 검사 한 코드에는 사전 사전이 있습니다.
일부 사용자 정의 클래스를 사용하면 도움이되지 않는 <someobject.ExampleClass object at 0x7f739267f400>
출력 이 발생할 수 있습니다 . 이 경우 __str__
메소드 를 구현 하거나 다른 솔루션을 시도 해야 할 수도 있습니다 . 타사 라이브러리없이 모든 시나리오에서 작동하는 간단한 것을 찾고 싶습니다.
"myObject"를 덤프하려면 :
from bson import json_util
import json
print(json.dumps(myObject, default=json_util.default, sort_keys=True, indent=4, separators=(',', ': ')))
나는 vars ()와 dir ()을 시도했다. 둘 다 내가 찾던 것에 실패했습니다. 객체에 __dict__가 없기 때문에 vars ()가 작동하지 않았습니다 (exceptions.TypeError : vars () 인수에 __dict__ 속성이 있어야 함). dir ()은 내가 찾고있는 것이 아니 었습니다. 필드 이름의 목록 일뿐이며 값이나 객체 구조를 제공하지 않습니다.
json.dumps ()는 default = json_util.default가없는 대부분의 객체에서 작동한다고 생각하지만 객체에 날짜 시간 필드가있어 표준 json serializer가 실패했습니다. Python에서 "datetime.datetime이 아닌 JSON 직렬화 가능"을 극복하는 방법을 참조하십시오 .
Flask Debug Toolbar를 사용해보십시오.
https://pypi.python.org/pypi/Flask-DebugToolbar
from flask import Flask
from flask_debugtoolbar import DebugToolbarExtension
app = Flask(__name__)
# the toolbar is only enabled in debug mode:
app.debug = True
# set a 'SECRET_KEY' to enable the Flask session cookies
app.config['SECRET_KEY'] = '<replace with a secret key>'
toolbar = DebugToolbarExtension(app)
__dict__
멤버 가있는 것은 아니지만 (re.MatchObject
예를 들어)dir()
모든 객체에 대해 내장 된 작업이 있습니다.