1
我使用Google風格的文檔字符串與sphinx.ext.autodoc自動生成我的函數的文檔,並確保它們在代碼中正確自我記錄。在同一函數中記錄不同的參數可能性
我有一個函數def myfunc(id=None, size=None, hash=None)
,基於id
或size + hash
返回信息。如果我們有id
作爲參數,則不需要size
和hash
,如果我們有size
和hash
作爲參數,則不需要id
。
使用sphinx,可以指定一個可選的參數,但在這種情況下,我們不知道什麼是強制性的,什麼是可選的。這裏有一個例子:
def get_file(id=0, size=0, hash="")
"""
Get file metadata.
Args:
id (int): id of the file.
size (int): file size in bytes.
hash (str): md5 hash of file.
Returns:
file_data (str): metadata information about the file.
"""
if id:
# Get file with id.
...
elif size and hash:
# Get file with size and hash.
...
else:
# Bad arguments, handle error.
...
return file_data
的問題是:如何分辨哪些參數是必要的文檔字符串?
你可以很容易得出該函數本身就是問題,這兩個參數對應該在各自獨立的功能,即使結果是一樣的:
def get_file_by_id(id)
"""
Get file metadata from id.
Args:
id (int): id of the file.
Returns:
file_data (str): metadata information about the file.
"""
# Get file with id.
...
return file_data
def get_file_by_hash(size, hash)
"""
Get file metadata from hash.
Args:
size (int): file size in bytes.
hash (str): md5 hash of file.
Returns:
file_data (str): metadata information about the file.
"""
# Get file with hash+size.
...
return file_data
但是,在這種情況下,單一的功能會如果可能的話,這是首選,因爲該函數是綁定到使用單個函數的另一個API。
這告訴參數是否是可選的,但如果我的情況適用於這個例子,** param1 **將會變成可選的,如果** param2 **被使用。 – toucanb
這個用法有點難以遵循。如果您正在設計一個採用可選參數的函數,那麼可以理解它恰好是*那*。如果這些參數對需要一起給出,你可能想把它們放在一個命名的元組或其他有用的結構中。這可能是更好的設計選擇。 – idjaw
個人而言,我認爲你應該堅持爲了清晰和明確的目的而分解你的函數。此外,使文檔更易於編寫。 – idjaw