Как правильно проверить типы объектов в Python? - PullRequest
3 голосов
/ 02 августа 2011

Проблема: я должен проверить, что возвращаемое значение - это словарь Python.

Q1.Какой из этих вариантов является правильным способом сделать это?

type(x) == dict

type(x) == type(dict)

isinstance(d, dict)

Тогда есть другие варианты, использующие оператор is вместо ==.

Q2. Многие люди говорят, что проверка типа объекта, как правило, плохая практика, но в отношении моей первоначальной проблемы, есть ли у меня другой выбор?

Ответы [ 3 ]

8 голосов
/ 02 августа 2011

Q1. Какой из этих вариантов является правильным способом сделать это?

Не тратьте время на проверку типов.

Он подвержен ошибкам, потому что основан на предположениях.

Q2. ... у меня есть другой выбор?

Да, сделайте это.

try:
    x.the_dict_operation()
except TypeError:
    # x was not the expected type for the operation
    raise # or whatever.

В большинстве случаев это означает "ничего не делать".

Просто напишите код. Если «каким-то образом» злонамеренный социопат использует неправильный тип, он просто рухнет, как и положено.

2 голосов
/ 02 августа 2011

Положитесь на поведение , а не на фактический тип (см. Другие ответы).

Многие объекты могут действовать как словари, вы не хотите заставлять пользователей вашей функции / API использовать простые подсказки, верно?

На прагматической стороне:

>>> type({})
<type 'dict'>
>>> dict
<type 'dict'>
>>> type(dict)
<type 'type'>
>>> isinstance({}, dict)
True
>>> isinstance("", dict)
False
1 голос
/ 02 августа 2011

Проверьте __getitem__ вместо проверки типа. Если вы действительно хотите проверить тип, все в порядке (ну, кроме type(x) == type(dict), это никогда не будет верно для экземпляра dict). isinstance, вероятно, самый стандартный способ сделать это.

...