AttributeError: ‘str‘ object has no attribute ‘prefix_chars‘——類範例化不帶括號的後果

2020-10-10 13:00:42

最近學習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。
在這裡插入圖片描述

本文試圖解釋該提示的含義以及報錯的原因

  1. ArgumentParser是一個類,並且繼承類_AttributeHolder和 _ActionsContainer。定義如下:
    class ArgumentParser(_AttributeHolder, _ActionsContainer):

    parser = argparse.ArgumentParser,不帶括號相當於給這個類起一個別名,並沒有範例化。parser其實指向的就是ArgumentParser。為什麼說相當於起了一個別名,更好的解釋見Python類和範例化或者Python類帶括號和不帶括號的區別

  2. parser.add_argument()相當於用類來呼叫add_argument()函數。add_argument()函數在類_ActionsContainer中定義。

  3. 類本身不能呼叫範例函數,但是可以在呼叫的時候提供一個範例。期待的範例是_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()

寫作不易,點贊鼓勵一下吧