首页 > 解决方案 > 在类 __init__ 中使用 Argparse

问题描述

是否可以在类中使用 Argparse,如果可以,如何将参数传递给解析器?有没有更好的方法来解决这个问题?到目前为止,这是我的代码:

class Game:
    def __init__(self):
        parser = argparse.ArgumentParser()
        parser.add_argument("num_players", help="Number of players", type=int)
        ...
        args = parser.parse_args()


if __name__ == '__main__':
    g = Game()

还有一种方法可以提供可选参数,例如--verbose

标签: pythonpython-3.xclassargumentsargparse

解决方案


它不太可能是最好的设计。

该类Game可能不应该关心它是如何初始化的,并且它可能对命令行参数一无所知。您最好在外部解析 CLI 参数,然后将参数传递给Game.__init__或至少传递给专用的Game.from_cli_args类方法。

import argparse

class Game:
    def __init__(self, num_players):
        print('Game got {} as num_players'.format(num_players))
        self.num_players = num_players


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("num_players", help="Number of players", type=int)
    ...
    args = parser.parse_args()

    g = Game(args.num_players)

然后执行:

$ python main.py 2
Game got 2 as num_players

如果您使用--作为前缀,则需要显式传递参数:

parser.add_argument("--num_players", help="Number of players", type=int)

然后

$ python main.py --num_players 2
Game got 2 as num_players

推荐阅读