#python #google-app-engine #types
#python #google-app-engine #типы
Вопрос:
Я пытаюсь убедиться, что объект имеет строковый тип в 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)
Что я должен использовать, чтобы проверить, является ли тип объекта строковым?
Комментарии:
1. является ли
value
переменная, которую вы пытаетесь преобразовать вdb.Text
?2. Зачем вы делаете это преобразование? Нужно ли вообще индексировать ваш столбец? Если да, то почему не имеет значения, что все, что превышает 512 байт, не индексируется?
3. Эй, Ник, причина, по которой я веду беседу, заключается в том, что исключение создавалось всякий раз, когда поле превышало 500 байт, потому что, по-видимому, вам приходится переключаться на неиндексированное свойство «text» более 500 байт?
Ответ №1:
Я думаю, вам просто нужно убрать круглые скобки из types.StringTypes
, поскольку это кортеж (и не вызываемый, отсюда и ошибка). Либо это, либо ваш код действительно использует StringType
, что означает, что ваш код создает новый экземпляр string вместо возврата str
типа. В любом случае, это похоже на опечатку. Смотрите документы.
Комментарии:
1. Я пробовал оба способа, по какой-то причине он все еще выдавал мне ошибку. Это сработало, хотя: isinstance (значение, типы. StringTypes)
Ответ №2:
Почему вы вызываете types.StringTypes
? Это кортеж:
>>> types.StringTypes
(<type 'str'>, <type 'unicode'>)
Используйте isinstance(value, types.StringTypes) and len(value) > 499
Ответ №3:
Грег Хаскинс прав
>>> 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("")
Ответ №4:
Редактировать: Упс! Я смотрел на типы.StringType вместо типов.StringTypes, поэтому тест может быть:
if type(value) in types.StringTypes and len(value) > 499:
value = db.Text(value)
Где основной проблемой с операционным кодом было наличие скобок в конце типов.StringTypes.
Оригинал: здесь несколько проблем:
- Если значение содержит Unicode, проверка его с помощью type() вернет типы.UnicodeType
- Типы.StringType — это константа, а не функция, поэтому опустите круглые скобки.
- Кроме того, типы.StringType не поддается итерации, поэтому протестируйте его с помощью == или is .
Таким образом, ваш тест может выглядеть примерно так:
if ((type(value) == types.StringType) or (type(value) == types.UnicodeType)) and len(value) > 499:
value = db.Text(value)
Комментарии:
1. @DutrowLLC: Смотрите мой обновленный ответ об использовании с типами. StringTypes
2. «если ввести (значение) в types. StringTypes и len(значение) > 499: «по-прежнему выдает ту же ошибку. Может быть, вы были правы в том, что он не является итеративным?
3. или используйте
isinstance(value, basestring)
.4. @DutrowLLC: Вы уверены, что используете типы. StringTypes (заканчивающийся на ‘s’), а не типы. StringType (без ‘s’ в конце)? Это то, что немного сбило с толку мой первый ответ. Кроме того, если вы используете старую версию Python, вы можете получить эту ошибку, поскольку в документации указано, что типы. StringTypes был введен в 2.2.
5. Да, я дважды проверял, я использовал типы. StringTypes. Я использую Python 2.7
Ответ №5:
Я предпочитаю isinstance(object_to_be_checked, str)
Комментарии:
1. Будьте осторожны с этим. В python 2.x это не будет работать для строк Unicode или других строковых объектов. Это лучше сделать
isinstance(obj, basestring)
, который все равно не сработает для не встроенных строкообразных объектов, но будет работать со строками Unicode и «обычными» строками.