Могу ли я как-нибудь получить конкретные сведения об исключении AttributeError в Python? - PullRequest
6 голосов
/ 01 января 2011

Я пытаюсь вызвать функцию. Одним из параметров является переменная с атрибутами (которую я знаю из-за полученного исключения AttributeError). Я не знаю точных атрибутов, которые должна иметь эта переменная, поэтому мне было интересно, есть ли какой-нибудь способ, которым я могу увидеть некоторые дополнительные детали об исключении, например, какой атрибут он не может найти. Спасибо.

Ответы [ 3 ]

13 голосов
/ 01 января 2011

AttributeError обычно идентифицирует отсутствующий атрибут.Например:

class Foo:
    def __init__(self):
        self.a = 1

f = Foo()
print(f.a)
print(f.b)

Когда я запускаю это, я вижу:

$ python foo.py
1
Traceback (most recent call last):
  File "foo.py", line 10, in <module>
    print(f.b)
AttributeError: Foo instance has no attribute 'b'

Это довольно явно.Если вы не видите ничего подобного, пожалуйста, опубликуйте точную ошибку , которую вы видите.

РЕДАКТИРОВАТЬ

Если вам нужно форсироватьраспечатав исключение (по какой-либо причине), вы можете сделать это:

import traceback

try:
    # call function that gets AttributeError
except AttributeError:
    traceback.print_exc()

Это должно дать вам полное сообщение об ошибке и трассировку, связанную с этим исключением.

2 голосов
/ 01 января 2011

Трассировка должна предупредить вас о доступе к атрибуту, вызвавшему исключение AttributeError:

>>> f.b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Foo instance has no attribute 'b'

Также можно преобразовать Exception в str:

>>> try:
...     f.b
... except AttributeError, e:
...     print e
... 
Foo instance has no attribute 'b'

Если вы хотите получить список атрибутов, доступных для объекта, попробуйте dir() или help()

>>> dir(f)
['__doc__', '__init__', '__module__', 'a']

>>> help(str)
Help on class str in module __builtin__:

class str(basestring)
 |  str(object) -> string
 |  
 |  Return a nice string representation of the object.
 |  If the argument is a string, the return value is the same object.
 |  
 |  Method resolution order:
 |      str
 |      basestring
 |      object
 |  
 |  Methods defined here:
 |  
 |  __add__(...)
 |      x.__add__(y) <==> x+y
 |  
[...]
 |  ----------------------------------------------------------------------
 |  Data and other attributes defined here:
 |  
 |  __new__ = <built-in method __new__ of type object>
 |      T.__new__(S, ...) -> a new object with type S, a subtype of T

Вы даже можете позвонить help() на dir (почему это оставлено в качестве упражнения для читателя):

>>> help(dir)
Help on built-in function dir in module __builtin__:

dir(...)

dir([object]) -> list of strings

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.

В противном случае вы всегда можете взглянуть на код, если только вам не был предоставлен какой-то предварительно скомпилированный модуль третьей стороной, и в этом случае вам следует запросить более качественную документацию (скажем, некоторые модульные тесты!) У вашего поставщика!

0 голосов
/ 01 января 2011

Обычно AttributeError несет некоторую информацию об этом:

#!/usr/bin/env python

class SomeClass(object):
    pass

if __name__ == '__main__':
    sc = SomeClass()
    print sc.fail

#   Traceback (most recent call last):
#   File "4572362.py", line 8, in <module>
#     print sc.fail
# AttributeError: 'SomeClass' object has no attribute 'fail'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...