2014-06-15 56 views
1

所以我只是在我的Python程序中追踪了一个奇怪的错误,这个错误是由于我混淆了函数的参数并且错误地将True传递给time.sleep()而导致的。蟒蛇似乎无声地转换True1为什么time.sleep在传递True时没有抱怨?

docs说:

暂停为给定秒数执行。参数可能是 浮点数...

通常,Python很高兴在输入与预期类型或范围不匹配时抛出异常。为什么sleep默默地将True转换为数字?

+0

是'睡眠“这是唯一的功能吗?或者其他功能默默地将'True'转换为数字? – nhgrif

回答

6

在蟒蛇,Boolint

>>> issubclass(bool, int) 
True 

一个子类下面是从SVN源:http://svn.python.org/projects/python/trunk/Modules/timemodule.c

PyArg_ParseTuple的ARG转换为floatd:

static PyObject * 
time_sleep(PyObject *self, PyObject *args) 
{ 
    double secs; 
    if (!PyArg_ParseTuple(args, "d:sleep", &secs)) 
     return NULL; 
    if (floatsleep(secs) != 0) 
     return NULL; 
    Py_INCREF(Py_None); 
    return Py_None; 
} 
+1

'bool'是**所有支持'bool'的**版本的'int'的子类。与Java不同,Python不会回避'True'和'False'为数值。任何接受整数和'time.sleep'的地方都必须接受bools。 – user4815162342

+0

你说得对,我不知道这是对py3k也 – Daenyth

+0

需要注意的是,从数字区分的bool语言经常这样做的实际原因,比如做'如果(富= 3)'错误的情况下。 Python不存在这个问题,因为分配无论如何都不是有效的表达式。 – user4815162342

相关问题