【问题标题】:Is it an Array or a String?它是数组还是字符串?
【发布时间】:2011-02-21 23:04:06
【问题描述】:

我得到的数据可以是字符串或数组。我需要根据它是哪一个来做不同的操作,所以我的问题是,如何判断一个对象是 Python 中的数组还是字符串?

conn = boto.connect_sdb(AWSKey, AWSSecret)
item = conn.get_domain(dName).get_item(imagekey)
tags = item['tag']

tags == array or string?

【问题讨论】:

  • 听起来你做错了。也许发布一些示例代码,以便我们提出更好的设计?
  • @jesse-j:所以为了澄清你的 Python 脚本是从外部源获取一些二进制 blob,你必须弄清楚上下文才能正确处理它?
  • 没什么大不了的。我有一个变量,它要么是一个字符串,要么是一个字符串数组。有更好的设计吗?也许是这样,但我无法控制它。
  • 对我来说,这不是对或错,它适合您的情况,具体取决于您的问题的上下文。

标签: python arrays string


【解决方案1】:

诚然,字符串是序列这一事实有时很尴尬。如果要根据处理“真实”序列还是字符串来实现不同的行为,可以使用如下构造:

if isinstance(some_obj, basestring):
    # do string processing
else:
    # do sequence processing

你需要使用basestring来正确处理unicode和非unicode字符串。

【讨论】:

  • +1:PEP 8 明确指出“对象类型比较应始终使用 isinstance() 而不是直接比较类型。”但请注意,basestring 在 2.3 之前不可用,因此需要 isinstance(obj, (str, unicode)) 来支持较旧的解释器。
  • 这应该是公认的答案,据我所知, isinstance(data, str) 大部分时间都会产生不正确的结果。
【解决方案2】:

如果“数组”是指列表,那么这就足够了:

if isinstance(data, list):
    # [...]
if isinstance(data, str):
    # "..."

如果你的意思是 array.array 而不是列表:

if isinstance(data, array.array):
    # ...

【讨论】:

  • 您几乎不应该在比较操作中使用type(whatever)。请改用isinstance()
【解决方案3】:

使用this 指南来识别变量的类型。

【讨论】:

  • 起初我以为链接到的指南是个笑话。 c.__class__.__name__==myclass.__name__ 怎么了?为什么不是 isinstance(c, myclass) ?
【解决方案4】:

处理此问题的一个好方法是编写一个函数,该函数接受一个列表或单个项目,但始终返回一个列表(在后一种情况下返回一个包含单个项目的列表)。

def listify(value):
    if isinstance(value, basestring):
        return [value]
    try:
        iter(value)
    except TypeError:
        return [value]
    return value

然后快速value = listify(value),你可以假装你一直有一个列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多