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


답변:


590

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

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

28
놀랍게도, 모든 객체에 __dict__멤버 가있는 것은 아니지만 ( re.MatchObject예를 들어) dir()모든 객체에 대해 내장 된 작업이 있습니다.
호브

print re.compile(r'slots').search('No slots here either.').__slots__
호브

3
나에게 새로운 것. 고마워. 그 점은 내 뇌의 모듈 경로 파서를 촉발시켰다. 라틴어 "모듈"도 고려하지 않았습니다.
호브

4
inspect대답 에 모듈에 대해 더 이야기하지 않습니까? 나는 그것이 print_r 또는 var_dump에 가장 가까운 것이라고 생각합니다.
Hai Phaikawl

1
로 표시된 속성 뒤에있는 값에 어떻게 액세스 dir()합니까? dir()이름의 목록 만 반환하며 모든 이름 vars()__dict__속성 에 있거나 속성 에있는 것은 아닙니다 .
HelloGoodbye

981

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

from pprint import pprint
pprint(vars(your_object))

24
vars()단순히 __dict__인수의 를 리턴하며 메소드 dir()가없는 경우 의 폴백이기도합니다 __dir__. dir()내가 말했듯이 처음부터 사용 하십시오.

28
@hop : dir()당신은 모든 당신이 아마 같은 신경 쓰지 않는 것들에 내장 제공 __str__하고 __new__. var()하지 않습니다.
Timmmm

14
__dict__속성 이없는 세트 및 기타 객체에서는 실패 합니다.
anatoly techtonik

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

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


5
unpythonic, 여기에 발명되지 않았습니다

14
뭐라고? 물론 getmembers()표준 inspect모듈에서이 기능을 사용할 수는 있지만 일반적으로 내부 검사를 수행하는 방법을 설명하는 데 더 유용하다고 생각했습니다.
Dan Lenski

20
전혀. dir (obj)는 찾을 수없는 속성 __dict__(예 : __doc____module__)을 보여줍니다 . 또한로 __dict__선언 된 객체에는 전혀 작동하지 않습니다 __slots__. 일반적으로 __dict__실제로 사전에 실제로 저장된 사용자 수준 속성을 보여줍니다. dir () 더 보여줍니다.
Dan Lenski

8
일부 클래스 / 객체에는 __dict__속성 / 구성원이 포함되어 있지 않습니다 . 나는 그것이 미쳤다는 것을 알고 있지만 사실이다. 같은 내장 기능 intstr또는 re.MatchObject의 일반적인 예입니다. 시도 'hello'.__dict__후 시도dir('hello')
호브

11
나는 그것이 "언피 토닉"인지 아닌지 상관하지 않습니다. 그것은 작업을 수행하는데, 디버깅에서 중요한 것은 유일한 일입니다.
hidefromkgb

59

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

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

o = O()

출력은 다음과 같습니다.

>>> o.__dict__

{'value': 3}

9
같은 객체 set가 없기 __dict__때문에 실패 할 것입니다AttributeError: 'set' object has no attribute '__dict__'
anatoly techtonik

23

"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

22

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

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

17

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

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

내 추천은 이것입니다-

https://gist.github.com/1071857

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

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

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


이것은 요점뿐만 아니라 핍과 토론이어야합니다!
phobie

2
> 간단히 말해서, 파이썬은이 위대한 객체 지향 패러다임에 관한 것입니다. 이차적으로 중요한 모듈.
memeplex

@memeplex python은 OOP 에 관한 것 입니까?
피터 우드

좋아, 단지이 위대한 OOP 에 관한 것 뿐이야 .
memeplex

13

을 사용하는 것이 좋습니다 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__.

아, +100500
Kirby

12

대부분의 경우, 사용 __dict__또는 dir()당신이 원하는하고있는 정보를 얻을 것이다. 더 자세한 정보가 필요한 경우 표준 라이브러리에는 inspect 모듈이 포함되어있어 매우 세부적인 정보 를 얻을 수 있습니다. 가장 많은 정보 중 일부는 다음과 같습니다.

  • 함수 및 메소드 매개 변수 이름
  • 클래스 계층
  • 함수 / 클래스 객체 구현의 소스 코드
  • 프레임 객체에서 지역 변수

당신은 단지를 찾고 있다면 "내 목적은 무엇 속성 값을 가질 수 있는가?", 다음 dir()__dict__아마 충분하다. 임의의 객체의 현재 상태를 실제로 파고 싶다면 (파이썬에서는 거의 모든 것이 객체라는 것을 명심하십시오), inspect고려할 가치가 있습니다.


가장 완전한 답변을 개선하기 위해 inspect에 대한 설명을 사용했습니다. 그것이 당신과 함께 잘되기를 바랍니다.
Fernando César

9

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

아니요. 가장 많이 찬성 된 답변에는 일부 속성이 제외되며 승인 된 답변은 비공개 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있습니다. 그러나 매우 도움이되었습니다-감사합니다!
nealmcb

@nealmcb 감사합니다. 봉사하게되어 기쁘다! :)
Aaron Hall

7

메타 프로그래밍 예제 마술로 덤프 객체 :

$ 고양이 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>

조금 구식이지만 여전히 작동합니다.


6

이것을 디버깅에 사용하고 모든 것의 재귀 덤프를 원한다면 클래스에 __str__이미 좋은 구현 이 필요하기 때문에 허용되는 대답은 만족스럽지 않습니다 . 그렇지 않은 경우 훨씬 효과적입니다.

import json
print(json.dumps(YOUR_OBJECT, 
                 default=lambda obj: vars(obj),
                 indent=1))

이 pymongo를 설치했다 파이썬 3에서 작동하지 않았다 및 @Clark의 대답에 따라 그것을
팀 오길비에게

여기에 다른 답변의 많은과 같은TypeError: vars() argument must have __dict__ attribute
을 강탈

6

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(), show_protected=True, show_static=True, show_properties=True)

산출:

__main__.A(_p = 8, foo = [0, 1, ..., 8, 9], s = 5)

정확히 내가 찾고있는 빠른 디버그 :), 훌륭한 찾기!
조셉 아스트라한

작은 힌트는 매개 변수 중 하나로서 깊이 = 6 (또는 필요한 거리)을 추가하고 재귀 세부 정보는 더 나아갈 수 있습니다. :). 목록을 인쇄하는 방법에 대해 내가 좋아하는 것 중 하나는 처음 2 개의 전체와 마지막 2 개의 항목을 표시하여 작동한다는 것을 알 수 있습니다.
Joseph Astrahan

4
from pprint import pprint

def print_r(the_object):
    print ("CLASS: ", the_object.__class__.__name__, " (BASE CLASS: ", the_object.__class__.__bases__,")")
    pprint(vars(the_object))

4

그러면 모든 객체 내용이 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)

4

나는 pprint 만 언급하는 대답을 상향 조정했습니다. 복잡한 데이터 구조의 모든 을 보려면 다음과 같이하십시오.

from pprint import pprint
pprint(my_var)

여기서 my_var 는 관심 변수입니다. 내가 사용했을 때 pprint(vars(my_var))아무것도 얻지 못했고 여기에 다른 답변이 도움이되지 않았거나 방법이 불필요하게 길어 보였습니다. 그건 그렇고, 내 특별한 경우, 내가 검사 한 코드에는 사전 사전이 있습니다.

일부 사용자 정의 클래스를 사용하면 도움이되지 않는 <someobject.ExampleClass object at 0x7f739267f400>출력 이 발생할 수 있습니다 . 이 경우 __str__메소드 를 구현 하거나 다른 솔루션을 시도 해야 할 수도 있습니다 . 타사 라이브러리없이 모든 시나리오에서 작동하는 간단한 것을 찾고 싶습니다.


3
> 일부 사용자 정의 클래스와 함께 ... 이것이 파이썬 팬이 아닌 이유입니다. "때때로"작동하고 "때때로"작동하지 않는 것
AlxVallejo

3

일부 로그에 DEBUG 정보를 인쇄해야했고 pprint를 사용할 수 없었습니다. 대신 나는 이것을했고 사실상 같은 것을 얻었다.

DO = DemoObject()

itemDir = DO.__dict__

for i in itemDir:
    print '{0}  :  {1}'.format(i, itemDir[i])

3

"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 직렬화 가능"을 극복하는 방법을 참조하십시오 .


네, pymongo tho를 설치해야했습니다.
Tim Ogilvy

3

왜 간단하지 않은가?

for key,value in obj.__dict__.iteritems():
    print key,value

그렇지 for key,value in obj.__dict__.iteritems(): print key,value않습니까?
Raz

2

pprint 에는 데이터 구조를 미적으로 기쁘게 표현할 수있는“예쁜 프린터”가 포함되어 있습니다. 포맷터는 인터프리터가 올바르게 구문 분석 할 수있는 데이터 구조의 표현을 생성하며 사람이 쉽게 읽을 수 있습니다. 출력은 가능하면 한 줄로 유지되며 여러 줄로 나눌 때 들여 쓰기됩니다.


2

그냥 beeprint를 시도 하십시오 .

다음과 같이 객체 변수 인쇄뿐만 아니라 아름다운 출력에도 도움이됩니다.

class(NormalClassNewStyle):
  dicts: {
  },
  lists: [],
  static_props: 1,
  tupl: (1, 2)

1
이 모듈은 더 이상 유지되지 않는 것으로 보이며 수많은 공개 된 문제가 있습니다. 오히려 사용 ppretty
Wavesailor

1

고군분투하는 모든 사람

  • vars() 모든 속성을 반환하지는 않습니다.
  • dir() 속성 값을 반환하지 않습니다.

다음 코드는 모든 속성을 obj해당 값으로 인쇄 합니다.

for attr in dir(obj):
        try:
            print("obj.{} = {}".format(attr, getattr(obj, attr)))
        except AttributeError:
            print("obj.{} = ?".format(attr))

오류는 없지만 재귀는 없으므로 많은 16 진수 주소를 얻으십시오
rob

0

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)

0

파이썬 객체 내장 유형 또는 값으로 작업하는 것을 좋아 합니다. .

메소드 또는 변수에 관계없이 속성의 경우 :

o.keys()

해당 속성의 값 :

o.values()

0

이것은 클래스 내, __init__ 내부 또는 외부에서 변수가 어떻게 정의되는지에 관계없이 작동합니다.

your_obj = YourObj()
attrs_with_value = {attr: getattr(your_obj, attr) for attr in dir(your_obj)}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.