动态处理Python字符串或列表

3 投票
3 回答
4303 浏览
提问于 2025-04-16 02:57

numberofrow这个变量,它的值是在表单字段中动态设置的。

现在因为numberofrow出现在多个表格中,当我从表单接收到这个变量时,

如果只有一个numberofrow,它是一个字符串,比如说numberofrow = 01。

如果有多个numberofrow,它就是一个列表,比如说numberofrow = [01, 02, 04]。

那么我该如何在我的Python代码中区分它是列表还是字符串呢?

我在考虑使用,

if type(numberofrow).__name__=='list':
    #do this
else:
    #do this

谢谢,

Sunny。

3 个回答

1

你可以按照你说的做,但有个更好的方法是:

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

如果它表现得像个字符串,那它是不是字符串就无所谓了。

4

你在用什么框架来获取表单中的值呢?一个靠谱的框架肯定会提供一种方法,让你总是能得到一个列表——具体来说,如果这个值只输入了一次,它会返回一个包含一个元素的列表;如果这个值根本没有输入,它会返回一个空列表。

比如,使用老牌的 cgi,你可以用 FieldStorage 实例的 getlist 方法——也就是说,使用 form.getlist('numberofrow'),而不是 form.getvalue('numberofrow'),后者的表现就像你说的那样,可能返回一个字符串或者一个列表——这样做会更简单、更优雅地解决你的问题!

6

为了这个目的,有一个内置的函数叫做 isinstance。你可以用它来检查一个对象是否属于某个类(而且和你的解决方案相比,这个测试还会考虑到父类)。

if isinstance(numberofrow, list):
    # do this
else:
    # do that

通常我们会这样做,比如 isinstance(numberofrow, basestring)。这里的 basestring 是 Python 2 中两个字符串类型的父类——str 和 unicode——这个测试会同时匹配这两种类型。

另外,你也可以提供一个可能的类/类型的元组,比如 isinstance(numberofrow, (list, tuple))。如果这个实例是列表或元组的实例,这个测试就会通过。

撰写回答