Reputation: 50362
I'm trying to make sure an object is a string type in Python (for google app engine). I'm doing this so that I can change it to a db.Text
type if its more than 500 bytes. However, I keep getting the error: TypeError 'unicode' object is not callable
if type(value) in types.StringTypes and len(value) > 499:
value = db.Text(value)
setattr(entity, key, value)
What should I use to test if the type of the object is a string?
Upvotes: 8
Views: 11979
Reputation: 18580
Edit: Oops! I was looking at types.StringType, instead of types.StringTypes, so the test could be:
if type(value) in types.StringTypes and len(value) > 499:
value = db.Text(value)
Where the main problem with the OP code was the presence of the parens at the end of types.StringTypes.
Original: A few problems here:
Thus, your test could look something like:
if ((type(value) == types.StringType) or (type(value) == types.UnicodeType)) and len(value) > 499:
value = db.Text(value)
Upvotes: 1
Reputation: 107628
Why are you calling types.StringTypes
? It's a tuple:
>>> types.StringTypes
(<type 'str'>, <type 'unicode'>)
Use isinstance(value, types.StringTypes) and len(value) > 499
Upvotes: 4
Reputation: 113965
Greg Haskins is right
>>> 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'>)
Could you do
if type(variable_name) == type("")
Upvotes: 1
Reputation: 6794
I think you just need to remove the parentheses from types.StringTypes
, since it is a tuple (and not callable, hence the error). Either that, or your code is actually using StringType
, which means your code is making a new string instance instead of returning the str
type. Either way, it looks like a typo. See the docs.
Upvotes: 6