【问题标题】:Using Argparse within a Class __init__在类 __init__ 中使用 Argparse
【发布时间】:2020-03-21 21:35:02
【问题描述】:

是否可以在类中使用 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

【问题讨论】:

  • 它不太可能是最好的设计。 Game 类可能不应该关心它是如何初始化的,并且它可能对命令行参数一无所知。您最好在外面解析 CLI args,然后将参数传递给 Game.___init__ 或至少传递给专用的 Game.from_cli_args 类方法。
  • 有可能。你有什么错误/问题?
  • @DeepSpace 这就是它最初的工作方式。我只是想使用 Argparse 的功能(即类型字段和可选参数)
  • 您可以在功能上使用任何您想要的argparse,只需在Game.__init__之外进行操作
  • core.py [-h] num_players core.py: error: the following arguments are required: num_players

标签: python python-3.x class arguments argparse


【解决方案1】:

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

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

【讨论】:

  • 这很好用。我最终这样做了,但在 __main__.py 中但工作方式相同。
【解决方案2】:

是的,您可以在类构造函数中使用 argparse。只需创建解析器对象并将所有参数传递给该对象,一旦您初始化类,您就可以使用该解析器对象访问所有参数。


class test:
        def __init__(self):
                self.parser = argparse.ArgumentParser(description='Process some integers.')
                self.parser.add_argument('integers', metavar='N', type=int, nargs='+',help='an integer for the accumulator')



        def  test123(self):
                args =  self.parser.parse_args()
                # prints argument
                print(args)


if __name__ == '__main__':
        x = test()
        x.test123()

输出:Namespace(integers=[1, 2, 3, 4])

【讨论】:

    猜你喜欢
    • 2016-11-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 2012-09-20
    • 2022-10-13
    • 2017-12-17
    • 2014-03-07
    相关资源
    最近更新 更多