2012-02-19 34 views
3

我在我在一分鐘腳本以下功能:「語法錯誤」關於Python返回true時3.2

def _convert_time(p): 
    """Converts a percentage into a date, 
    based on current date.""" 

    # This is the number of years that we subtract from 
    # the current date. 
    p_year = pow(math.e, (20.344 * pow(p, 3) + 3)) - pow(math.e, 3) 

    # Returns in YYYY-MM-DD format 
    date_in_history = date.today() - timedelta(days=(p_year * 365) 

    # Return to the control loop 
    return True 

我所有的功能,使用這個系統在年底返回true,這是由於有一箇中央功能按順序運行每個功能,並檢查它們在執行下一個功能之前是否正確運行。

然而,當我運行該腳本之前,我甚至去輸入一個值來啓動腳本中,我得到以下錯誤:

File "C:\Users\Callum\Desktop\Tempus\TempusTest.py", line 59 
return True 
    ^

如果我讓在返回True空閒的功能和檢查它,它工作正常,但由於某種原因,它不在我的腳本

你們有什麼想法,爲什麼這可能是?

謝謝! :)

+1

如果沒有返回值(或至少,它不是什麼偶然),我建議你放棄返回true制度,並堅持「迴歸」。如果出現一些意外行爲,我認爲最好反而提出一個錯誤。換句話說,如果從上述兩個任務中沒有錯誤,則總是返回True,所以True是......沒有意義。但是如果發生錯誤,它會處於未處理狀態並暫停。特別是因爲你正在對返回的「真」進行檢查,所以它在風格上反對Python'優先行事,後道歉'(假設值會起作用,並且如果不好), – hexparrot 2012-02-19 00:20:45

回答

12

您缺少一個括號。

你需要改變這一行:

date_in_history = date.today() - timedelta(days=(p_year * 365) 

有:

date_in_history = date.today() - timedelta(days=(p_year * 365)) 
                  ^
                   | 
                 it was this one :) 

問:爲什麼它顯示在返回行一個錯誤,不是嗎?

因爲錯誤實際上存在。

Python如何知道你不會在下一行提供另一個合法的timedelta參數?
或者將+100添加到(p_year * 365)(如DSM建議)

讓我們一起來看看這款IDE會話:

>>> t = ('one', 'two', 
...  'three' 
... def f(): pass 
    File "<stdin>", line 3 
    def f(): pass 
    ^
SyntaxError: invalid syntax 

IDE將無法知道我的元組已經完成,我不會添加'fourth'元素。

你可能想扮演魔鬼的擁護者,並且說我不會輸入逗號,所以Python應該猜到我將在那裏結束元組。

但是看看這個其他例子:

>>> t = ('one', 'two', 
...  'three' 
...  'fourth') 
>>> 
>>> t 
('one', 'two', 'threefourth') 

所以當你看到錯誤究竟發生時Python會在它不應該是一個地方遇到了return True

+0

謝謝! :D那麼爲什麼它在回報線上顯示錯誤,而不是在那裏? – 2012-02-19 00:37:34

+0

@CallumBooth:因爲下一行可能是'+ 100'之類的東西。你不需要在同一行關閉括號,所以它只會在返回時變成*語法錯誤。一般來說,當你在一行看起來很好的時候有一個SyntaxError時,通常是因爲它之前有一個未終止的元素。 – DSM 2012-02-19 00:51:36

+0

@Callum:帝斯曼已經解釋說,對我來說,無論如何,我已經改進了我的答案。 – 2012-02-19 00:56:44

1

錯誤是在行前。

date_in_history = date.today() - timedelta(days=(p_year * 365) 
          10   1  2   1 

date_in_history = date.today() - timedelta(days=(p_year * 365)) 
          10   1  2   10 

缺少一個右括號

+2

詳細解釋這個答案:Python不能告訴你你犯了什麼錯誤,它只能告訴你它在哪裏混淆。由於如果圓括號是開放的,Python會自動繼續下一行的語句,所以只有在表達式的中間部分看到「return」(它認爲仍然是)時,它纔會感到困惑。 – kindall 2012-02-19 00:39:14

+1

@kindall:詞彙失敗。 Python不會混淆;它會在第一個可能的令牌處正確檢測並報告語法錯誤。 – 2012-02-19 01:41:23

+2

我是擬人化的。我知道電腦討厭這個,但我無法幫助它。 – kindall 2012-02-19 01:42:38