2015-07-10 43 views
2

我打算在這裏使用argparse作爲示例,但我認爲它適用於很多事情。考慮:應該如何設計長時間函數調用的代碼?

parser = argparse.ArgumentParser(description="This is a description of how this program works.") 
subparsers = parser.add_subparsers(title="subcommands") 
parser_sub1 = subparsers.add_parser("sub1", 
            description="subcommand 1 does something something something") 
parser_sub1.add_argument("arg1", 
         help="Arg1 does somethign something something.") 

等等20多條醜陋的線。

add_argument特別是add_parser行很長,主要是因爲幫助/描述字符串。但我看不出有什麼明顯的辦法來乾淨地縮短它們。正如你所看到的,以通常的方式縮進第二行只能獲得幾個字符。將字符串分割成多行會很快變得笨拙。

我遇到了這個問題,同時運行一些代碼通過-m pep8,它抱怨幾乎每個add_argument行都是> 80個字符。根本問題似乎是,直到開放括號的部分本身就太長了,以致於後來適配字符串,即使在參數之間有一個斷開和縮進。有幾個方法我能想到的解決這個問題:

  • 現場有很長的線,而忽略PEP8
  • 下縮進的連續行和忽略PEP8
  • 用非常短的變量名保存字符(如ps1 = parser.add_subparsers(whatever)
  • 別名我可以節省更多的(例如,psaa = parser_sub1.add_argument每個塊)
  • 讓一堆字典文字,並將其解壓到有**(但我的一個發現字典文字一個痛苦的函數調用與)
  • 從外部文件中讀取函數調用參數,格式不太尷尬,可能是YAML,然後解壓縮(但不知道代碼在做什麼而不必引用另一個文件)
  • ...某事其他?

是否有一種已知的有效方法來處理冗長的函數參數,當自然寫入時,對80個字符約定卡住?

+0

我會建議拆分長行。 –

+0

與大多數語言不同,Python有一個權威的風格指南,可以說明這個問題。動議重新提交。 – msw

回答

0

這是一個味道和意見的問題,但在這裏,有兩個!

  • 很少真正的代碼堅持嚴格的80列推薦。值得避免難以處理的,長線,但狹隘地堅持來自打卡的約束是愚蠢的。 PEP8也解決了這個問題:

有些團隊強烈偏好較長的行長度。對於代碼維護 完全或主要由一個團隊,可以就這個 問題達成協議,它是好的,增加從80名義線路長度爲100個 字符(有效地增加了最大長度99個 字符)

  • 對於這樣的事情,製作某種你主要通過文字表達的數據結構,然後鏟入配置調用,無論是通過** args還是使用循環,都可能是最令人驚訝的。它使所有的文本可讀,內聯,並在一個地方,因此很容易編輯。你應該能夠在你的代碼中看起來模糊的文檔類似的blob。
+0

很多人堅持80或100或120個字符的列。我們的團隊設置了100個字符的硬限制,因爲否則在我們的任何筆記本電腦屏幕上編寫代碼變得非常困難。我一開始也很懷疑,但這對我來說是一個完全有效的易於限制硬性字符的eason。 –

+0

@AnubianNoob爲了便於閱讀和爲了能夠按尺寸顯示兩個窗口/框架的代碼,限制是有用的。然而,太過於掛斷了80,是毫無意義的。事實上,所討論的PEP幾乎是這樣說的。我已經用報價更新了答案。 – pvg

+0

哦,當然,爲了成爲一個沒有意義的數字而掛上特定的號碼。但根據您的團隊的偏好設定嚴格的限制並考慮任何新的團隊成員是件好事。 –

0
x = ('string literal broken across two lines ' 
... 'but it works because the parens keeps them together.') 
>>> x 
'string literal broken across two lines but it works because the parens keeps them together.' 

>>> print('If this was already in the parens of an argument list ' 
...  'you are already in a context where string literal ' 
...  'concatenation works.') 
If this was already in the parens of an argument list you are already in a context where string literal concatenation works. 
相關問題