1

What is the proper way to use **kwargs in Python to call function and get the output from script? I will like to use the script like that:

python script.py <argument> "here description"

Here my example

class Task:
    pass

    def __init__(self, **kwargs):
        arguments = {'cre': 'create', 'inf': 'info', 'sre': 'search', 'com': 'comment'}
        arguments.update(kwargs)
        self.create = arguments['cre']
        self.action = arguments['inf']
        self.search = arguments['sre']
        self.comment = arguments['com']

    def create(description):
         print "Task in progress -->-->"

    def search(description):
        print "Searching for task"

    def info(description):
        print "Task Info"

    def comment(description):
        print "Comment task"

if __name__=='__main__':
    Task(**kwargs)

On current script i get:

Traceback (most recent call last):
  File "simple_function.py", line 39, in <module>
    Task(**kwargs)
NameError: name 'kwargs' is not defined
shx2
  • 61,779
  • 13
  • 130
  • 153
Robert
  • 651
  • 1
  • 6
  • 18
  • 1
    You can get command line arguments from `sys.argv` – khelwood Nov 27 '15 at 11:28
  • `Task(**kwargs)`: in this line there are are no kwargs yet, `sys.argv` does give you command-line arguments, but as a list, not a dict, so more processing is needed – user2390182 Nov 27 '15 at 11:33
  • You can't get argument names from command line like this. Maybe you should look into [`argparse`](https://docs.python.org/3/library/argparse.html) library. – Ozgur Vatansever Nov 27 '15 at 11:33

1 Answers1

1

Try this:

import sys

class Task(object):

    def __init__(self, **kwargs):

        functions_mapping = {
            'cre': self.create,
            'inf': self.info,
            'sre': self.search,
            'com': self.comment
        }

        for key, value in kwargs.items():
            self.description = value
            try:
                functions_mapping.get(key)()
            except TypeError:
                print "Please provide a correct function name: {}".format(', '.join([x for x in functions_mapping.keys()]))

    def create(self):
        print "Task in progress --> {}".format(self.description)

    def search(self):
        print "Searching for task --> {}".format(self.description)

    def info(self):
        print "Task Info --> {}".format(self.description)

    def comment(self):
        print "Comment task --> {}".format(self.description)


if __name__=='__main__':
    if len(sys.argv) > 1 and len(sys.argv) < 4:
        function, description = sys.argv[1:]
        my_dict = dict()
        my_dict[function] = description
        Task(**my_dict)

Output:

➜  python stackoverflow.py com something_here
Comment task --> something_here

➜  python stackoverflow.py inf something_else
Task Info --> something_else

➜  python stackoverflow.py sre something_more
Searching for task --> something_more

➜  python stackoverflow.py cre somethingggggg
Task in progress --> somethingggggg

➜  python stackoverflow.py moo foobar
Please provide a correct function name: inf, sre, com, cre
Andrés Pérez-Albela H.
  • 4,003
  • 1
  • 18
  • 29