Có một chức năng tích hợp để in tất cả các thuộc tính và giá trị hiện tại của một đối tượng không?


Câu trả lời:


591

Bạn đang thực sự pha trộn hai thứ khác nhau.

Sử dụng dir(), vars()hoặc các inspectmô-đun để có được những gì bạn đang quan tâm (tôi sử dụng __builtins__làm ví dụ, bạn có thể sử dụng bất kỳ đối tượng thay vì).

>>> l = dir(__builtins__)
>>> d = __builtins__.__dict__

In từ điển đó tuy nhiên bạn thích:

>>> print l
['ArithmeticError', 'AssertionError', 'AttributeError',...

hoặc là

>>> 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',
...

In đẹp cũng có sẵn trong trình gỡ lỗi tương tác như một lệnh:

(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
Đáng ngạc nhiên, dường như không phải tất cả các đối tượng đều có một __dict__thành viên ( re.MatchObjectví dụ), nhưng dựng sẵn dir()hoạt động cho tất cả các đối tượng.
hobs

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

3
Mới một cái với tôi. Cám ơn. Dấu chấm kích hoạt trình phân tích cú pháp mô-đun não của tôi. Thậm chí không bao giờ được coi là "mô-đun" Latin.
hobs

4
Tại sao bạn không nói nhiều hơn về inspectmô-đun trong câu trả lời của bạn? Tôi nghĩ đó là thứ gần nhất với print_r hoặc var_dump.
Hai Phaikawl

1
Làm thế nào để bạn truy cập các giá trị đằng sau các thuộc tính được liệt kê bởi dir(), sau đó? dir()chỉ trả về một danh sách các tên, và không phải tất cả những cái đó tồn tại trong vars()hoặc trong __dict__thuộc tính.
HelloGoodbye

981

Bạn muốn vars()trộn với pprint():

from pprint import pprint
pprint(vars(your_object))

24
vars()chỉ đơn giản trả về __dict__đối số của nó và đó cũng là dự phòng dir()trong trường hợp không có __dir__phương thức. Vì vậy, sử dụng dir()ở nơi đầu tiên, như tôi đã nói.

28
@hop: dir()cung cấp cho bạn tất cả những thứ được tích hợp trong những thứ mà bạn có thể không quan tâm __str__và thích __new__. var()không.
Timmmm

14
Điều này không thành công trên các tập hợp và các đối tượng khác không có __dict__thuộc tính.
anatoly techtonik

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

Có nhiều chức năng của bên thứ 3 ngoài đó có thêm các chức năng như xử lý ngoại lệ, in ký tự quốc gia / đặc biệt, đệ quy vào các đối tượng lồng nhau, v.v. theo sở thích của tác giả. Nhưng tất cả họ về cơ bản đun sôi xuống này.


5
unpythonic, bởi vì không được phát minh ở đây

14
Nói gì cơ? Chắc chắn, bạn có thể sử dụng getmembers()chức năng trong inspectmô-đun tiêu chuẩn , nhưng tôi nghĩ rằng điều này sẽ hữu ích hơn ở chỗ nó minh họa cách thực hiện nội quan nói chung.
Dan Lenski

20
KHÔNG CÓ GÌ. dir (obj) hiển thị các thuộc tính không được tìm thấy trong __dict__(như __doc____module__). Hơn nữa, __dict__hoàn toàn không hoạt động đối với các đối tượng được khai báo __slots__. Nói chung, __dict__hiển thị các thuộc tính cấp người dùng thực sự được lưu trữ trong từ điển bên trong. dir () hiển thị nhiều hơn.
Dan Lenski

8
Một số lớp / đối tượng không chứa bất kỳ __dict__thuộc tính / thành viên nào. Tôi biết điều đó thật điên rồ, nhưng sự thật. Tích hợp như intstrhoặc re.MatchObjects là những ví dụ phổ biến. Hãy thử 'hello'.__dict__, sau đó thửdir('hello')
hobs 18/03 '

11
Tôi không quan tâm đó là «unpythonic» hay không. Nó hoàn thành công việc, trong đó gỡ lỗi là điều duy nhất và duy nhất quan trọng.
Hidefromkgb

59

dir đã được đề cập, nhưng nó sẽ chỉ cung cấp cho bạn tên của các thuộc tính. Nếu bạn muốn giá trị của chúng cũng hãy thử __dict__.

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

o = O()

Đây là đầu ra:

>>> o.__dict__

{'value': 3}

9
Các đối tượng như setkhông có __dict__, vì vậy đối với họ, nó sẽ thất bại vớiAttributeError: 'set' object has no attribute '__dict__'
anatoly techtonik

23

Bạn có thể sử dụng hàm "dir ()" để làm điều này.

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

Một tính năng hữu ích khác là trợ giúp.

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

Để in trạng thái hiện tại của đối tượng bạn có thể:

>>> obj # in an interpreter

hoặc là

print repr(obj) # in a script

hoặc là

print obj

Đối với các lớp của bạn định nghĩa __str__hoặc __repr__phương thức. Từ tài liệu Python :

__repr__(self)Được gọi bởi repr()hàm tích hợp và chuyển đổi chuỗi (dấu ngoặc kép) để tính toán biểu diễn chuỗi "chính thức" của một đối tượng. Nếu có thể, nó sẽ trông giống như một biểu thức Python hợp lệ có thể được sử dụng để tạo lại một đối tượng có cùng giá trị (được cung cấp một môi trường thích hợp). Nếu điều này là không thể, một chuỗi có dạng "<... một số mô tả hữu ích ...>" sẽ được trả về. Giá trị trả về phải là một đối tượng chuỗi. Nếu một lớp định nghĩa repr () nhưng không __str__(), thì __repr__()cũng được sử dụng khi biểu diễn chuỗi "không chính thức" của các thể hiện của lớp đó là bắt buộc. Điều này thường được sử dụng để gỡ lỗi, vì vậy điều quan trọng là đại diện phải giàu thông tin và không rõ ràng.

__str__(self)Được gọi bởi hàm str()dựng sẵn và bằng câu lệnh in để tính toán biểu diễn chuỗi "không chính thức" của một đối tượng. Điều này khác __repr__()ở chỗ nó không phải là một biểu thức Python hợp lệ: thay vào đó có thể sử dụng một biểu diễn thuận tiện hoặc ngắn gọn hơn. Giá trị trả về phải là một đối tượng chuỗi.


Tùy chọn này hữu ích để in các chuỗi được nối với nội dung của đối tượng:print "DEBUG: object value: " + repr(obj)
AlejandroVD

17

Có thể đáng để kiểm tra -

Có Python tương đương với Dữ liệu của Perl :: Dumper không?

Đề nghị của tôi là thế này -

https://gist.github.com/1071857

Lưu ý rằng perl có một mô-đun gọi là Data :: Dumper giúp dịch dữ liệu đối tượng trở lại mã nguồn perl (NB: nó không dịch mã trở lại nguồn và hầu như bạn luôn không muốn các hàm phương thức đối tượng trong đầu ra). Điều này có thể được sử dụng để kiên trì, nhưng mục đích chung là để gỡ lỗi.

Có một số điều mà pprint python tiêu chuẩn không đạt được, đặc biệt là nó chỉ dừng lại khi nó nhìn thấy một thể hiện của một đối tượng và cung cấp cho bạn con trỏ hex bên trong của đối tượng (errr, con trỏ đó không được sử dụng nhiều bởi cách). Vì vậy, tóm lại, python là tất cả về mô hình hướng đối tượng tuyệt vời này, nhưng các công cụ bạn lấy ra khỏi hộp được thiết kế để làm việc với một cái gì đó không phải là các đối tượng.

Dữ liệu perl :: Dumper cho phép bạn kiểm soát mức độ bạn muốn đi sâu và cũng phát hiện các cấu trúc được liên kết tròn (điều đó thực sự quan trọng). Quá trình này về cơ bản dễ dàng đạt được hơn trong perl vì các đối tượng không có phép thuật đặc biệt nào ngoài phước lành của họ (một quy trình được xác định rõ ràng trên toàn cầu).


Đây phải là một pip và một cuộc tranh luận không chỉ là ý chính!
phobie

2
> Vì vậy, tóm lại, python là tất cả về mô hình hướng đối tượng tuyệt vời này, nhưng các công cụ bạn lấy ra khỏi hộp được thiết kế để làm việc với một thứ khác ngoài các đối tượng ... Khá là một tuyên bố khi ví dụ duy nhất bạn cung cấp là mô đun quan trọng thứ cấp.
memeplex

@memeplex, nơi nào nói python là tất cả về OOP?
Peter Wood

Ok, nó chỉ nói lên tất cả về OOP tuyệt vời này , xấu của tôi.
memeplex

13

Tôi khuyên bạn nên sử dụng 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__.

Ồ, anh bạn, +100500
Kirby

12

Trong hầu hết các trường hợp, sử dụng __dict__hoặc dir()sẽ giúp bạn có được thông tin bạn muốn. Nếu bạn cần thêm chi tiết, thư viện tiêu chuẩn bao gồm mô-đun kiểm tra , cho phép bạn có được một số lượng chi tiết ấn tượng. Một số đề xuất thực sự của thông tin bao gồm:

  • Tên của các tham số hàm và phương thức
  • phân cấp lớp
  • mã nguồn của việc thực hiện một đối tượng hàm / lớp
  • biến cục bộ ra khỏi một đối tượng khung

Nếu bạn chỉ tìm kiếm "những gì giá trị thuộc tính không đối tượng của tôi có?", Sau đó dir()__dict__có lẽ là đủ. Nếu bạn thực sự muốn tìm hiểu về trạng thái hiện tại của các đối tượng tùy ý (hãy nhớ rằng trong python hầu hết mọi thứ đều là một đối tượng), thì inspectđáng để xem xét.


Sử dụng lời giải thích của bạn về kiểm tra để cải thiện câu trả lời đầy đủ nhất. Hy vọng điều đó ổn với bạn.
Fernando César

9

Có một chức năng tích hợp để in tất cả các thuộc tính và giá trị hiện tại của một đối tượng không?

Không. Câu trả lời được đánh giá cao nhất loại trừ một số loại thuộc tính và câu trả lời được chấp nhận cho biết cách nhận tất cả các thuộc tính, bao gồm các phương thức và các phần của api không công khai. Nhưng không có nội dung hoàn chỉnh tốt chức năng cho việc này.

Vì vậy, hệ quả tất yếu là bạn có thể tự viết, nhưng nó sẽ tính toán các thuộc tính và các mô tả dữ liệu được tính toán khác là một phần của API công khai và bạn có thể không muốn điều đó:

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

Vấn đề với câu trả lời khác

Quan sát ứng dụng của câu trả lời được bình chọn hàng đầu hiện nay trên một lớp với rất nhiều loại thành viên dữ liệu khác nhau:

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

chỉ in:

{'baz': 'baz'}

Bởi vì vars chỉ trả về __dict__đối tượng và nó không phải là bản sao, vì vậy nếu bạn sửa đổi lệnh được trả về bởi vars, bạn cũng sẽ sửa đổi __dict__chính đối tượng đó.

vars(obj)['quux'] = 'WHAT?!'
vars(obj)

trả về:

{'baz': 'baz', 'quux': 'WHAT?!'}

- đó là xấu vì quux là một thuộc tính mà chúng ta không nên đặt và không nên ở trong không gian tên ...

Áp dụng lời khuyên trong câu trả lời hiện được chấp nhận (và những người khác) không tốt hơn nhiều:

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

Như chúng ta có thể thấy, dirchỉ trả về tất cả (thực tế chỉ là hầu hết) các tên được liên kết với một đối tượng.

inspect.getmembers, được đề cập trong các ý kiến, là thiếu sót tương tự - nó trả về tất cả các tên giá trị.

Từ lớp học

Khi giảng dạy, các sinh viên của tôi tạo ra một hàm cung cấp API công khai về mặt ngữ nghĩa của một đối tượng:

def api(obj):
    return [name for name in dir(obj) if name[0] != '_']

Chúng ta có thể mở rộng điều này để cung cấp một bản sao của không gian tên ngữ nghĩa của một đối tượng, nhưng chúng ta cần loại trừ __slots__không được gán và nếu chúng ta thực hiện nghiêm túc yêu cầu "thuộc tính hiện tại", chúng ta cần loại trừ các thuộc tính được tính toán (như chúng có thể trở nên đắt đỏ và có thể được hiểu là không "hiện tại"):

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

Và bây giờ chúng tôi không tính toán hoặc hiển thị tài sản, quux:

>>> attrs(obj)
{'bar': 0, 'baz': 'baz', 'foo': ''}

Hãy cẩn thận

Nhưng có lẽ chúng ta biết tài sản của mình không đắt. Chúng tôi có thể muốn thay đổi logic để bao gồm chúng là tốt. Và có lẽ chúng tôi muốn loại trừ các mô tả dữ liệu tùy chỉnh khác thay thế.

Sau đó, chúng ta cần tùy chỉnh thêm chức năng này. Và do đó, điều hợp lý là chúng ta không thể có một chức năng tích hợp có thể biết chính xác những gì chúng ta muốn và cung cấp nó. Đây là chức năng chúng ta cần tạo ra chính mình.

Phần kết luận

Không có chức năng tích hợp nào thực hiện điều này và bạn nên làm những gì phù hợp nhất về mặt ngữ nghĩa cho tình huống của bạn.


Có một dấu ngoặc đơn thêm gần sau FunctionType. Nhưng rất hữu ích - cảm ơn!
nealmcb

@nealmcb cảm ơn tôi nghĩ tôi đã nhận nó. Vui mừng được phục vụ! :)
Aaron Hall

7

Một ví dụ siêu lập trình đối tượng Dump với phép thuật :

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

Không có đối số:

$ python dump.py
<__main__.Data instance at 0x00A052D8>

Với sử dụng Gnosis :

$ python dump.txt 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>

Nó hơi lỗi thời nhưng vẫn hoạt động.


6

Nếu bạn đang sử dụng điều này để gỡ lỗi và bạn chỉ muốn kết xuất đệ quy mọi thứ, câu trả lời được chấp nhận là không thỏa mãn vì nó yêu cầu các lớp của bạn đã __str__triển khai tốt . Nếu đó không phải là trường hợp, điều này hoạt động tốt hơn nhiều:

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

Điều này không hoạt động trên python 3. Phải cài đặt pymongo và thực hiện theo câu trả lời của @Clark
Tim Ogilvy

cũng như nhiều câu trả lời khác ở đâyTypeError: vars() argument must have __dict__ attribute
cướp

6

thử 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)

Đầu ra:

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

chính xác những gì tôi đang tìm kiếm để gỡ lỗi nhanh chóng :), tìm thấy tuyệt vời!
Joseph Astrahan

gợi ý nhỏ thêm độ sâu = 6 (hoặc tuy nhiên bạn cần) là một trong các tham số cho nó và các chi tiết đệ quy có thể đi xa hơn :). Một trong những điều tôi thích về cách in danh sách là nó hiển thị 2 mục nhập đầu tiên và 2 mục cuối để bạn biết nó hoạt động
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

Điều này in ra tất cả các nội dung đối tượng đệ quy ở định dạng thụt lề json hoặc 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

Tôi đã đưa ra câu trả lời chỉ đề cập đến dấu ấn. Để rõ ràng, nếu bạn muốn xem tất cả các giá trị trong cấu trúc dữ liệu phức tạp, thì hãy làm một cái gì đó như:

from pprint import pprint
pprint(my_var)

Trong đó my_var là biến quan tâm của bạn. Khi tôi sử dụng, pprint(vars(my_var))tôi không nhận được gì, và các câu trả lời khác ở đây không giúp được gì hoặc phương pháp này trông có vẻ không cần thiết. Nhân tiện, trong trường hợp cụ thể của tôi, mã tôi đang kiểm tra có một từ điển từ điển.

Đáng để chỉ ra rằng với một số lớp tùy chỉnh, bạn có thể kết thúc với một <someobject.ExampleClass object at 0x7f739267f400>loại đầu ra không có ích . Trong trường hợp đó, bạn có thể phải thực hiện một __str__phương pháp hoặc thử một số giải pháp khác. Tôi vẫn muốn tìm một cái gì đó đơn giản hoạt động trong tất cả các kịch bản, không có thư viện của bên thứ ba.


3
> với một số lớp tùy chỉnh ... Đây là lý do tại sao tôi không phải là fan hâm mộ của python. Những điều "đôi khi" hoạt động và "đôi khi" không
AlxVallejo 19/12/17

3

Tôi đã cần in thông tin DEBUG trong một số nhật ký và không thể sử dụng pprint vì nó sẽ phá vỡ nó. Thay vào đó tôi đã làm điều này và nhận được hầu như điều tương tự.

DO = DemoObject()

itemDir = DO.__dict__

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

3

Để kết xuất "myObject":

from bson import json_util
import json

print(json.dumps(myObject, default=json_util.default, sort_keys=True, indent=4, separators=(',', ': ')))

Tôi đã thử vars () và dir (); cả hai đều thất bại cho những gì tôi đang tìm kiếm. vars () không hoạt động vì đối tượng không có __dict__ (ngoại lệ.TypeError: vars () đối số phải có thuộc tính __dict__). dir () không phải là thứ tôi đang tìm kiếm: nó chỉ là một danh sách các tên trường, không đưa ra các giá trị hoặc cấu trúc đối tượng.

Tôi nghĩ rằng json.dumps () sẽ hoạt động cho hầu hết các đối tượng mà không có default = json_util.default, nhưng tôi đã có trường datetime trong đối tượng nên trình tuần tự json chuẩn không thành công. Xem Cách khắc phục "datetime.datetime không JSON serializable" trong python?


Được rồi, bạn phải cài đặt pymongo tho để sử dụng nó.
Tim Ogilvy

3

Tại sao không phải là một cái gì đó đơn giản:

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

Có nên như for key,value in obj.__dict__.iteritems(): print key,valuevậy không?
Raz

2

pprint chứa một máy in khá đẹp mắt, dùng để tạo các biểu diễn thẩm mỹ cho cấu trúc dữ liệu của bạn. Trình định dạng tạo ra các biểu diễn cấu trúc dữ liệu có thể được phân tích cú pháp chính xác bởi trình thông dịch và cũng dễ dàng cho người đọc. Đầu ra được giữ trên một dòng, nếu có thể và thụt lề khi chia thành nhiều dòng.


2

Chỉ cần thử bíp .

Nó sẽ giúp bạn không chỉ với việc in các biến đối tượng, mà cả đầu ra đẹp, như thế này:

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

1
Mô-đun này dường như không còn được duy trì nữa và có một số vấn đề mở. Thay vì sử dụng ppretty
Wavesailor 14/2/19

1

Cho mọi người đấu tranh với

  • vars() không trả lại tất cả các thuộc tính.
  • dir() không trả về giá trị của các thuộc tính.

Đoạn mã sau in tất cả các thuộc tính của objvới các giá trị của chúng:

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

không có lỗi, nhưng không đệ quy vì vậy chỉ cần nhận được nhiều địa chỉ hex
cướp

0

Bạn có thể thử Thanh công cụ gỡ lỗi Flask.
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

Tôi thích làm việc với các loại khóa hoặc giá trị của đối tượng python .

Đối với các thuộc tính bất kể chúng là phương thức hay biến:

o.keys()

Đối với các giá trị của các thuộc tính đó:

o.values()

0

Điều này hoạt động bất kể các varibles của bạn được định nghĩa như thế nào trong một lớp, bên trong __init__ hoặc bên ngoài.

your_obj = YourObj()
attrs_with_value = {attr: getattr(your_obj, attr) for attr in dir(your_obj)}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.