Skip to main content

Custom actions for argparse package

Project description

This module implements some reusable custom actions to use with the argparse module.

Examples

The following example, taken from samples/folder_actions.py demonstrates the use of a custom action to verify the existence of a folder, specified from the command line:

import argparse
import argparse_actions

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Custom Actions')
    parser.add_argument('directory',
                action=argparse_actions.FolderExistsAction)

    try:
        args = parser.parse_args()
        print 'Directory exists: {0}'.format(args.directory)
    except argparse_actions.NonFolderError as e:
        print 'Directory does not exist'
        print e

In the next example from samples/proper_ip.py, we use the ProperIpFormatAction custom action to verify if an IP address from command line is properly formatted:

import argparse
import argparse_actions

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Custom Actions')
    parser.add_argument('ip',
                    action=argparse_actions.ProperIpFormatAction)

    try:
        args = parser.parse_args()
        print 'IP is properly formatted: {0}'.format(args.ip)
    except argparse_actions.InvalidIp as e:
        print 'IP is invalid: {0}'.format(e.ip)
        # This will display similar output:
        # print e

Extending the Custom Actions

If you find a custom action that almost do what you want, you can

  1. Write your own from scratch
  2. Submit an enhancement request
  3. Extend the existing custom action

I am not commenting on option 1–it is your choice. For option 2, I will be gladly to accept any reasonable request, but sometimes life happens and I might not response quickly enough. That leaves you with the third option of extending the custom action yourself. Don’t worry, it is not that hard. In the next example, I will take the ProperIpFormatAction custom action and extend it to include ‘localhost’ as one of the proper IP format:

import argparse
import argparse_actions

class IpAndLocalhostAction(argparse_actions.ProperIpFormatAction):
    def __call__(self, parser, namespace, values, option_string=None):
        # Do our check: allow for 'localhost'
        if values == 'localhost':
            setattr(namespace, self.dest, values)
        else:
            # Super class to perform its check
            parent = super(IpAndLocalhostAction, self)
            parent.__call__(parser, namespace, values, option_string)

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Custom Actions')
    parser.add_argument('ip', action=IpAndLocalhostAction)

    try:
        args = parser.parse_args()
        print 'IP is valid: {0}'.format(args.ip)
    except argparse_actions.InvalidIp as e:
        print e

Discussion:

  • The first step is to create a new class (IpAndLocalhostAction), based on an existing custom action (argparse_actions.ProperIpFormatAction, which is really a class itself)
  • Define the function __call__ to override the base custom action with your own logic.

More Ideas

Here are a few ideas I have in mind, which I might implement:

  • Extend ProperIpFormatAction to determine if and IP…
    • Is reachable
    • Provides some services such as HTTP or FTP
    • Belongs to a particular list, such as the banned IP list
  • Extend FolderExistsAction to determine if the folder is…
    • Writable
    • Empty
    • A symbolic link

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
argparse_actions-0.4.4.tar.gz (5.5 kB) Copy SHA256 hash SHA256 Source None Jun 10, 2013

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging AWS AWS Cloud computing DataDog DataDog Monitoring Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page