2014-06-15 55 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

相關問題