【问题标题】:Python, elegant way to test for a set/list/tuple, expecting stringsPython,测试集合/列表/元组的优雅方式,期待字符串
【发布时间】:2014-01-29 16:42:38
【问题描述】:

我正在构建 SQL 查询的正则表达式,并将其传递给 Python 函数。这是我目前正在做的事情(iterable 是传递给函数的变量):

if isinstance(iterable, (list, tuple, set)):
    app = '|'.join(iterable)

我希望能够测试一个抽象(参见集合模块的 ABC),这意味着它是一个容器,而不是 basestring。 (这是可迭代的!)

有没有办法改进以上内容?

【问题讨论】:

  • isinstance(iterable, collections.Container) and not isinstance(iterable, str) ?
  • 抱歉,正在回复之前声称iterable 是本机类型的评论。集合中有Iterable,但没有iterable afaik。评论被删除了,所以我猜他们是混淆了不同的语言?
  • 我会这样做:if not isinstance(iterable, basestring): app = '|'.join(iterable)。不要检查特定的序列......让它进行鸭式打字,只记录你想要一个可迭代的字符串或字符串。
  • @Bakuriu 这确实发生在我身上,但你应该把它写下来。

标签: python arrays string set typechecking


【解决方案1】:

我认为不存在这样的东西——你所拥有的可能是最好的。

有时,我的函数可以接受字符串(我将拆分)或字符串的可迭代。对于那些,我通常会进行否定测试,即

if isinstance(iterable, basestring):
    iterable = iterable.split(',')

等等

【讨论】:

  • 感谢您的反馈!我会为此努力 +1,但我希望有人告诉我有更好的方法。
  • 好吧,问题是你不想测试类型,你想测试功能,无论是隐式(鸭子类型)还是显式(使用 ABC,从基类实例化,或者像callable这样的函数。所以,首先你需要定义你想要的抽象功能应该传递给可迭代对象,而不是字符串。通常,没有一个容易的。
  • 接受,因为没有更好的办法!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-28
  • 2017-08-27
  • 1970-01-01
  • 2016-03-22
  • 2020-01-05
相关资源
最近更新 更多