parse_known_args()方法的用處就是有些時候,你的選項配置可能不會在一個函數或包中調用完成
在很多使用,我們可能會需要根據一些輸入的選項,比如在深度學習中,我們可能會根據傳入的模型設置--model來決定我們調用的是那個模型代碼,然后在該模型中還會有一部分的選項設置
那么這時候就會出現一種情況就是運行命令中會傳入所有需要設置的選項值,但是有時候僅獲取到基本設置時可能要進行一些操作然后才繼續導入剩下的參數設置
parse_known_args()方法的作用就是當僅獲取到基本設置時,如果運行命令中傳入了之后才會獲取到的其他配置,不會報錯;而是將多出來的部分保存起來,留到后面使用
舉例說明:
import argparse def basic_options(): parser = argparse.ArgumentParser() parser.add_argument('--data_mode', type=str, default= 'unaligned', help='chooses how datasets are loaded') parser.add_argument('--mode', type=str, default='test', help='test mode') return parser def data_options(parser): parser.add_argument('--lr', type=str, default='0.0001', help='learning rate') return parser if __name__ == '__main__': parser = basic_options() opt, unparsed = parser.parse_known_args() print(opt) print(unparsed) parser = data_options(parser) opt = parser.parse_args() print(opt)
運行:
(deeplearning) userdeMacBook-Pro:pytorch-CycleGAN user$ python test_data.py --data_mode aligned --lr 0.0002 Namespace(data_mode='aligned', mode='test') ['--lr', '0.0002'] Namespace(data_mode='aligned', lr='0.0002', mode='test')
該例子說明了在一開始僅導入了basic_options()選項時,多余出來的--lr選項會被保存起來,不會報錯,直到接下來導入了data_options(parser)之后再將其賦值
這時候如果我們傳入一個沒有配置的選項,它在中間的時候也會保存起來,但是最后就會報錯:
(deeplearning) userdeMacBook-Pro:pytorch-CycleGAN user$ python test_data.py --data_mode aligned --lr 0.0002 --no_clue True Namespace(data_mode='aligned', mode='test') ['--lr', '0.0002', '--no_clue', 'True'] usage: test_data.py [-h] [--data_mode DATA_MODE] [--mode MODE] [--lr LR] test_data.py: error: unrecognized arguments: --no_clue True
其他:如果想要以字符串形式獲取選項值,在最后添加一行:
print('{data_mode}_{mode}_{lr}'.format(**vars(opt)))
返回:
(deeplearning) userdeMacBook-Pro:pytorch-CycleGAN user$ python test_data.py --data_mode aligned --lr 0.0002 Namespace(data_mode='aligned', mode='test') ['--lr', '0.0002'] Namespace(data_mode='aligned', lr='0.0002', mode='test') aligned_test_0.0002
