最近學習yoloV3,看給出的程式碼使用argparse模組寫命令列引數,覺得很好。
今天嘗試自己用argparse模組寫引數,如下程式碼所示:
import argparse
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument('--epochs', type=int, default=100, help='number of epochs')
parser.add_argument('--batch_size', type=int, default=2, help='size of each image batch')
opt = parser.parse_args()
print('opt', opt)
但是執行報錯:AttributeError: ‘str’ object has no attribute ‘prefix_chars’。
並且在程式碼中有這樣的提示:Expected type ‘_ActionsContainer’, got ‘str’ instead。
ArgumentParser是一個類,並且繼承類_AttributeHolder和 _ActionsContainer。定義如下:
class ArgumentParser(_AttributeHolder, _ActionsContainer):
parser = argparse.ArgumentParser,不帶括號相當於給這個類起一個別名,並沒有範例化。parser其實指向的就是ArgumentParser。為什麼說相當於起了一個別名,更好的解釋見Python類和範例化或者Python類帶括號和不帶括號的區別
parser.add_argument()相當於用類來呼叫add_argument()函數。add_argument()函數在類_ActionsContainer中定義。
類本身不能呼叫範例函數,但是可以在呼叫的時候提供一個範例。期待的範例是_ActionsContainer,但是給的是‘–epochs’。所以提示Expected
type ‘_ActionsContainer’, got ‘str’ instead。
prefix_chars是類_ActionsContainer中定義的屬性
而且‘–epochs’不是類,更沒有屬性’prefix_chars’,所以報錯AttributeError: ‘str’ object
has no attribute ‘prefix_chars’
該錯誤的原因是在類範例化時沒有帶括號,錯誤的形式如下:
parser = argparse.ArgumentParser
正確的形式如下,不會報錯。
parser = argparse.ArgumentParser()
寫作不易,點贊鼓勵一下吧