Поиск типа в Python - TypeError 'Unicode' объект не вызывается - PullRequest
8 голосов
/ 10 мая 2011

Я пытаюсь убедиться, что объект является строковым типом в Python (для google app engine). Я делаю это так, чтобы я мог изменить его на тип db.Text, если его более 500 байтов. Тем не менее, я получаю сообщение об ошибке: TypeError 'unicode' object is not callable

    if type(value) in types.StringTypes and len(value) > 499:
        value = db.Text(value)
    setattr(entity, key, value)

Что я должен использовать, чтобы проверить, является ли тип объекта строкой?

Ответы [ 5 ]

6 голосов
/ 10 мая 2011

Я думаю, что вам просто нужно удалить скобки из types.StringTypes, так как это кортеж (а не вызываемый, следовательно, ошибка). Либо так, либо ваш код фактически использует StringType, что означает, что ваш код создает новый строковый экземпляр вместо того, чтобы возвращать тип str. В любом случае, это выглядит как опечатка. См. документы .

4 голосов
/ 10 мая 2011

Почему вы звоните types.StringTypes?Это кортеж:

>>> types.StringTypes
(<type 'str'>, <type 'unicode'>)

Использование isinstance(value, types.StringTypes) and len(value) > 499

1 голос
/ 10 мая 2011

Редактировать: Упс! Я смотрел на types.StringType вместо types.StringTypes , поэтому тест может быть:

if type(value) in types.StringTypes and len(value) > 499:
    value = db.Text(value)

Там, где основной проблемой с кодом OP было присутствие паренов в конце типов. StringTypes.

Оригинал: Несколько проблем здесь:

  • Если значение содержит Unicode, тестирование его с помощью type () вернет types.UnicodeType
  • Типы. StringType - это константа, а не функция, поэтому снимите скобки.
  • Кроме того, types.StringType не повторяется, поэтому проверьте его с помощью == или is.

Таким образом, ваш тест может выглядеть примерно так:

if ((type(value) == types.StringType) or (type(value) == types.UnicodeType)) and len(value) > 499:
    value = db.Text(value)
1 голос
/ 10 мая 2011

Грег Хаскинс прав

>>> types.StringTypes()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable
>>> types.StringTypes
(<type 'str'>, <type 'unicode'>)

Не могли бы вы сделать

if type(variable_name) == type("")
0 голосов
/ 10 мая 2011

Я предпочитаю isinstance(object_to_be_checked, str)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...