Python 객체 내부를 어떻게 보는가?
파이썬(짱고 웹 개발, 판다3D 게임 개발 등)을 활용한 다양한 프로젝트에서 코딩을 시작하고 있다.
무슨 일이 일어나고 있는지 이해하는 데 도움을 주기 위해, 나는 파이톤 물체 내부에서 파이톤 물체들이 어떻게 그들의 방법과 속성처럼 똑딱거리는지 기본적으로 보고 싶다.
그래서 내가 파이톤 물체를 가지고 있다고 하면, 내용물을 출력하려면 무엇이 필요할까?그게 가능하긴 해?
Python은 강한 자기성찰 기능을 가지고 있다.
다음과 같은 내장 기능을 살펴보십시오.
type()
그리고dir()
특히 개체 유형과 해당 속성 집합을 각각 검사하는 데 유용하다.
object.__dict__
아직 아무도 도와주지 않은 게 놀랍군!
In [1]: def foo():
...: "foo!"
...:
In [2]: help(foo)
Help on function foo in module __main__:
foo()
foo!
도움말을 통해 문서 문자열을 읽고 수업 시간에 어떤 속성이 있을 수 있는지 알 수 있으며, 이것은 꽤 도움이 된다.
먼저 출처를 읽어라.
두 번째, 다음 항목을 사용하십시오.dir()
기능을 하다
만약 이게 무슨 일이 일어나고 있는지 알아보기 위한 탐사를 위한 것이라면, 나는 IPython을 보는 것을 추천하고 싶다.이렇게 하면 객체 설명서, 속성 및 소스 코드를 얻기 위한 다양한 바로 가기가 추가된다.예를 들어 함수에 "?"를 추가하면 개체에 대한 도움말이 제공된다(효과적으로 "help(obj)"의 바로 가기, 2 ?'를 사용하는 wheras(")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에 관심이 있다면, 오브제이브로이서를 보아라.아래에 있는 개체 자기성찰을 위해 Python 표준 라이브러리의 검사 모듈을 사용한다.
셸의 dir()와 함께 객체의 속성을 나열할 수 있다.
>>> dir(object())
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
물론 검사 모듈도 있다: http://docs.python.org/library/inspect.html#module-inspect
예쁜걸 입어봐
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
)
다른 사람들에 의해 이미 언급된 바 있지만, 나는 몇 가지 맥락을 추가하고 싶다.
pprint 모듈은 임의의 Python 데이터 구조를 통역사의 입력으로 사용할 수 있는 형태로 "귀중하게" 인쇄할 수 있는 기능을 제공한다.정형화된 구조물이 기본적인 파이썬 유형이 아닌 객체를 포함하는 경우, 표현을 로드할 수 없을 수 있다.파일, 소켓, 클래스 또는 인스턴스와 같은 개체뿐만 아니라 파이썬 상수로 나타낼 수 없는 다른 기본 제공 개체도 포함될 수 있다.
pprint
의 대안을 찾고 있는 PHP 경력이 있는 개발자들이 수요가 많을 수 있다.
받아쓰기 속성이 있는 객체는 다음을 사용하여 잘 덤프할 수 있음pprint()
와 섞여서.__dict__
모듈, 클래스, 인스턴스 등의 속성:
from pprint import pprint
pprint(vars(your_object))
글로벌 또는 로컬 범위에 포함된 모든 변수를 덤프하려면 다음을 사용하십시오.
pprint(globals())
pprint(locals())
locals()
함수에 정의된 변수를 표시한다.
또한 문자열 키로 해당 이름을 사용하여 기능에 액세스하는 것도 유용하며,
locals()['foo']() # foo()
globals()['foo']() # foo()
마찬가지로 모듈의 내용 또는 개체의 속성을 볼 때 사용하십시오.
그리고 아직 더 있다.
"""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__
다른 사람들은 이미 당신이 찾고 있는 것처럼 들리는 빌트인()에 대해 언급했지만, 여기 또 다른 좋은 팁이 있다.대부분의 표준 라이브러리를 포함한 많은 라이브러리는 원본 형식으로 배포된다.즉, 소스 코드를 쉽게 직접 읽을 수 있다는 것이다.비결은 그것을 찾는 것이다. 예를 들면 다음과 같다.
>>> import string
>>> string.__file__
'/usr/lib/python2.5/string.pyc'
*.pyc 파일이 컴파일되므로 후행 'c'를 제거하고 즐겨찾는 편집기 또는 파일 뷰어에서 컴파일되지 않은 *.py 파일을 여십시오.
/usr/lib/python2.5/string.py
나는 이것이 주어진 API에서 어떤 예외가 제기되는지를 발견하는 데 믿을 수 없을 정도로 유용하다는 것을 발견했다.이런 종류의 세부사항은 파이톤 세계에서는 거의 기록되어 있지 않다.
코드 검사를 위한 두 가지 유용한 도구:
아이피톤.탭 완료를 사용하여 검사할 수 있는 Python 터미널.
Eclipse with PyDev 플러그인.주어진 지점에서 부서지고 모든 변수를 트리로 탐색해 물체를 검사할 수 있는 뛰어난 디버거를 가지고 있다.내장된 단말기를 사용하여 해당 지점에서 코드를 시도하거나 객체를 입력하고 '.'를 눌러 코드 힌트를 줄 수도 있다.
다른 사람이 지적한 바와 같이 파라미터와 방법을 살펴보려면 다음을 사용하십시오.pprint
또는dir()
내용물의 실제 값을 보고자 할 경우
object.__dict__
pprint와 dir가 함께하면 효과가 크다.
이러한 목적을 위한 파이썬 코드 라이브러리 구축: 검사 Python 2.7
객체에 해당하는 함수의 소스 코드를 보려면myobj
, 당신은 입력 할 수 있다.iPython
또는Jupyter Notebook
:
myobj??
Python 3.8에서는 를 이용하여 물체의 내용을 출력할 수 있다.__dict__
예를 들어,
class Person():
pass
person = Person()
## set attributes
person.first = 'Oyinda'
person.last = 'David'
## to see the content of the object
print(person.__dict__)
{"first": "Oyinda", "last": "David"}
import pprint
pprint.pprint(obj.__dict__)
또는
pprint.pprint(vars(obj))
조금 더 섬세한 해결책을 찾고 있다면 오브지프린트를 시도해 볼 수 있을 것이다.그것의 긍정적인 측면은 중첩된 물체를 다룰 수 있다는 것이다.예를 들면 다음과 같다.
from objprint import objprint
class Position:
def __init__(self, x, y):
self.x = x
self.y = y
class Player:
def __init__(self):
self.name = "Alice"
self.age = 18
self.items = ["axe", "armor"]
self.coins = {"gold": 1, "silver": 33, "bronze": 57}
self.position = Position(3, 5)
objprint(Player())
출력할것
<Player
.name = 'Alice',
.age = 18,
.items = ['axe', 'armor'],
.coins = {'gold': 1, 'silver': 33, 'bronze': 57},
.position = <Position
.x = 3,
.y = 5
>
>
살아 있는 물체 안을 들여다보고 싶다면, 파이톤이.inspect
모듈은 좋은 대답이다.일반적으로 디스크의 어딘가에 있는 소스 파일에서 정의되는 함수의 소스 코드를 가져오는 데 사용된다.통역기에 정의된 라이브 함수 및 람다 소스(source)를 얻으려면dill.source.getsource
그것은 또한 curry에 정의된 바운드 또는 바인딩되지 않은 클래스 방법과 함수에 대한 코드를 얻을 수 있다...그러나 개체 코드를 포함하지 않으면 해당 코드를 컴파일할 수 없을 수 있다.
>>> 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)
객체의 속성을 반환한다.
라고 불리는 아주 멋진 도구가 있다.이것의 사용법에 대한 간단한 예가 있다.explore
팬더 데이터프레임에서 작동한다.
import pandas as pd
df=pd.read_csv('https://storage.googleapis.com/download.tensorflow.org/data/heart.csv')
from objexplore import explore
explore(df)
다음 항목이 셸에 표시됨:
또한 내부 목록과 사전을 보려면 pprint()를 사용하십시오.
이미 많은 좋은 팁들이 있지만, 가장 짧고 쉬운 것(꼭 최고일 필요는 없음)은 아직 언급되지 않았다.
object?
다음을 사용해 보십시오.
print(object.stringify())
- 어디에
object
검사하려는 개체의 변수 이름.
이것은 개체의 모든 키와 값의 계층을 보여주는 적절한 형식과 탭으로 된 출력물을 출력한다.
참고: 이것은 python3에서 작동한다.이전 버전에서 작동하는지 확실하지 않음
업데이트: 모든 유형의 개체에서는 작동하지 않음.요청 개체와 같은 유형 중 하나가 발생하는 경우 다음 유형 중 하나를 대신 사용하십시오.
dir(object())
또는
import pprint
다음:pprint.pprint(object.__dict__)
참조URL: https://stackoverflow.com/questions/1006169/how-do-i-look-inside-a-python-object
'Programing' 카테고리의 다른 글
React-Native: 모듈 AppRegistry가 등록된 호출 가능한 모듈 (0) | 2022.03.25 |
---|---|
useSelector with React.memo vs connect (0) | 2022.03.25 |
이번의history.properties/"는 나를 홈페이지로 리디렉션하지 않는다. (0) | 2022.03.25 |
nuxt 구성 파일의 저장소에 액세스 (0) | 2022.03.25 |
파이썬에서 크론 같은 스케줄러를 어떻게 구하지? (0) | 2022.03.25 |