2013-11-01 33 views
0

我正在写一些库函数,我发现自己希望函数接受一个字符串或一个字符串列表的输入,并返回相同的类型。Python“string-or-string-list”类型约定?

我曾想到过几种方法,但都显得笨拙。对于每个概念函数,我可以写:

  • 一个单独的函数用于字符串和字符串列表。但是这需要调用代码来知道变量的类型,并选择适当的函数。
  • 只是一个函数,它根据使用'isinstance(inputarg,str):'检测输入类型来决定做什么。这至少隐藏了库中的多个选项,而不是在调用者中。

但我想知道是否有一些更优雅的方法或成语,我忽略了?

澄清:在这两种解决方案中,我更喜欢第二种方法,即创建一个多态的单个函数,以接受(并返回)字符串或字符串列表。然而,即使在这种情况下,基于isinstance()的切换看起来像是一种不雅,可能有更好的选择。

+0

我很少希望将单个值当作一系列这样的值处理。您能提供一个更具体的例子吗? – user2864740

+0

字符串列表是否执行其他操作,而不是将单个字符串所使用的逻辑应用于列表中的每个元素,可能返回结果值列表? – SingleNegationElimination

+0

只要是最完整的,你可以有一个函数,它需要两个参数(每种类型之一)并且使用不是无的。但我认为这不合格的“优雅”测试。 :-)根据预期的使用情况,可变参数可能有意义。我喜欢你的两种方法。命名该方法并很好地引用。 –

回答

1

isinstance是可以的。

更好的方法是测试你需要的字符串(而不是列表)的某种方法,然后再次测试列表(而不是字符串)所需的某种方法,如果两者都得不到,则引发一个AssertionError。

您可以测试使用hasattr()的方法。

+0

请注意,字符串*是一串字符串。所以除非你明确指出它需要一个'list',而不是像'tuple'这样的其他任何类型的序列,否则你不能真正测试你需要的序列而不是字符串。你可以用另一种方式来测试,不在其他序列上的字符串。当然,理想情况下,当输入是一个字符串时,你实际上会使用一些字符串函数,在这种情况下,你可以继续使用它,当它不是字符串时捕获异常,并且执行你所做的事情一串字符串。 –

+0

说明:字符串=字符序列(即:不是字符串序列)。此外,@ dstromberg的想法测试列表的方法是好的,只要检查字符串后完成。但是需要指出的是,首先检查一个序列会不必要地接受一个字符串。 – gwideman

1

我会倾向于只有一个函数采取可迭代的字符串。如果您需要使用单个字符串s调用它,则始终可以将其称为f([s])f((s,))

+0

这是一个额外的方法,但是这仍然需要调用者知道s的类型,并且对字符串vs字符串列表以不同的方式调用f()。 – gwideman

+0

@gwideman:将问题推向调用栈,即调用者的调用者。 :) – NPE

+0

@gwideman通常我们知道所有变量的类型(模子和鸭子打字)。没有这些知识你就无法真正写出许多有用的代码。你的来电者有什么特别的意思,他们可能不知道这种类型? – delnan