Spiff
Spiff

Reputation: 673

Using Argparse within a Class __init__

Is it possible to use Argparse from within a class and if so, how would you get the parameters to the parser? Is there a better way of going about this? Here is my code so far:

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()

Also Is there a way of supplying optional arguments such as --verbose?

Upvotes: 10

Views: 13028

Answers (2)

DeepSpace
DeepSpace

Reputation: 81684

It is highly unlikely to be the best design.

The Game class should probably not care how it was initialized, and it should probably know nothing about command line arguments. You will be better off parsing the CLI args outside, then pass the arguments to Game.__init__ or at least to a dedicated Game.from_cli_args classmethod.

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)

Then executing:

$ python main.py 2
Game got 2 as num_players

If you use -- as a prefix the argument will need to be passed explicitly:

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

Then

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

Upvotes: 13

Shreyanshu
Shreyanshu

Reputation: 85

yeah, you can use argparse inside class constructor.just create parser object and pass all arguments to that object, once you initialise class you can access all arguments using that parser object.


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()

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

Upvotes: 0

Related Questions