动态处理Python字符串或列表
numberofrow这个变量,它的值是在表单字段中动态设置的。
现在因为numberofrow出现在多个表格中,当我从表单接收到这个变量时,
如果只有一个numberofrow,它是一个字符串,比如说numberofrow = 01。
如果有多个numberofrow,它就是一个列表,比如说numberofrow = [01, 02, 04]。
那么我该如何在我的Python代码中区分它是列表还是字符串呢?
我在考虑使用,
if type(numberofrow).__name__=='list':
#do this
else:
#do this
谢谢,
Sunny。
3 个回答
你可以按照你说的做,但有个更好的方法是:
if isinstance(numberofrow, list):
# do this
else:
# do that
另外一种方法是把这个对象当成字符串来用,当出现问题时再改变它的行为:
try:
validated = numberofrow.isdigit()
except AttributeError:
# must be a list?
# do something else
else:
# must be a string
# do the string thing
如果它表现得像个字符串,那它是不是字符串就无所谓了。
你在用什么框架来获取表单中的值呢?一个靠谱的框架肯定会提供一种方法,让你总是能得到一个列表——具体来说,如果这个值只输入了一次,它会返回一个包含一个元素的列表;如果这个值根本没有输入,它会返回一个空列表。
比如,使用老牌的 cgi,你可以用 FieldStorage
实例的 getlist
方法——也就是说,使用 form.getlist('numberofrow')
,而不是 form.getvalue('numberofrow')
,后者的表现就像你说的那样,可能返回一个字符串或者一个列表——这样做会更简单、更优雅地解决你的问题!
为了这个目的,有一个内置的函数叫做 isinstance。你可以用它来检查一个对象是否属于某个类(而且和你的解决方案相比,这个测试还会考虑到父类)。
if isinstance(numberofrow, list):
# do this
else:
# do that
通常我们会这样做,比如 isinstance(numberofrow, basestring)
。这里的 basestring 是 Python 2 中两个字符串类型的父类——str 和 unicode——这个测试会同时匹配这两种类型。
另外,你也可以提供一个可能的类/类型的元组,比如 isinstance(numberofrow, (list, tuple))
。如果这个实例是列表或元组的实例,这个测试就会通过。