最近學習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()
寫作不易,點贊鼓勵一下吧
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/166259.html
標籤:其他
下一篇:2.2 Python編程規范
