1

以下代码显示错误:

if ((type(varA) or type(varB) ) == type('t')):
    print "string involved"
elif varA<varB:
    print "RANDOM"

错误是针对这种情况的:

Test Values: varA = 0, varB = adios

输出:

RANDOM

而另一段代码

if ((type(varA) == type('t')) or (type(varB)== type('t'))):
    print "string involved"
elif varA<varB:
    print "RANDOM"`

对于以下测试值:

Test Values: varA = 6, varB = adios

输出如下:

string involved

这两个“如果”条件有什么区别?我发现它们具有相同的逻辑!

4

3 回答 3

5

这是错误的:

if ((type(varA) or type(varB) ) == type('t')):

它应该是:

if type(varA) == str or type(varB) == str:

等效地:

if isinstance(varA, str) or isinstance(varB, str):

或者更短一点:

if str in ((type(varA), type(varB)):
于 2013-10-21T01:51:46.510 回答
1

问题是这个表达式:

if ((type(varA) or type(varB) ) == type('t')):

编程语言不像英语那样工作。上面首先计算type(varA) or type(varB),这将产生varA- 因为or返回第一个真值并且任何类型都是真值。

然后它将检查它是否与type('t')- 即str. varA这意味着只有当是一个字符串时它才会为真,并且类型varB被完全忽略。

你想要的可能是这样的:

if type(varA) == type('t') or type(varB) == type('t'):

但是有更多惯用/ Pythonic的方法可以做到这一点;有关一些示例,请参见 Óscar López 的回答。

于 2013-10-21T01:56:35.097 回答
1

如果您希望测试也适用于子类,str那么使用isintance而不是type

if any(isinstance(x, str) for x in (varA, varB)):
    ...
于 2013-10-21T02:07:12.660 回答