【问题标题】:handling python string or list dynamically动态处理python字符串或列表
【发布时间】:2010-08-18 05:13:46
【问题描述】:

行数, 它的值在表单字段中动态设置。

现在由于 numberofrow 在多个表中, 当我从表单接收到该变量时,

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

如果多于一个 numberofrow,它是一个列表,例如。 numberofrow = [01, 02, 04]

现在我如何区分它在我的 python 代码中是列表还是字符串?

正在考虑使用,

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

谢谢, 晴天。

【问题讨论】:

标签: python


【解决方案1】:

为此,有一个名为isinstance 的内置程序。您可以使用它来检查对象是否是该类的实例(与您的解决方案相比,此测试中还考虑了超类)。

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

isinstance(numberofrow, basestring) 之类的操作很常见。 basestring 是 Python 2 中两种字符串类型(str 和 unicode)的超类,测试将匹配它们。

或者,您还可以提供可能的类/类型的元组,例如isinstance(numberofrow, (list, tuple))。如果实例是列表或元组的实例,则此测试将成功。

【讨论】:

    【解决方案2】:

    您使用什么框架从表单中获取该值?一个明智的方法肯定会提供一种返回 always 列表的方法——特别是,如果该值只输入了一次,则返回一个单项列表(并且可能,如果该值尚未在全部,一个空列表)。

    例如,对于旧的cgi,您将使用FieldStorage 实例的getlist 方法——form.getlist('numberofrow') 而不是form.getvalue('numberofrow'),它的行为与您描述的一样,返回一个字符串或一个列表——这将更简单、更优雅地解决你的所有问题!

    【讨论】:

      【解决方案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
      

      如果它的行为像一个字符串,那么它是否是一个字符串并不重要。

      【讨论】:

      • 由于代码比较大,如果numberofrow是字符串,是否可以把它转换成一个列表,变量名和numberofrow一样,然后再做剩下的编码?
      • @sunny,这是个好主意。这就是亚历克斯所说的,数据总是一个列表的好处。所以,就像你说的,如果它是一个字符串,把它变成一个列表。你要小心,因为字符串在很多方面都像列表一样(两者都是序列并具有该接口)。
      • @ Eric,我是这样工作的。 @Alex,我正在使用 plone 框架。感谢大家的解决方案。
      猜你喜欢
      • 2012-01-02
      • 2023-02-26
      • 2023-02-26
      • 2021-12-11
      • 2012-07-27
      • 2016-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多