How do I create a Python namespace (argparse.parse_args value)?

前端 未结 3 821
终归单人心
终归单人心 2020-12-04 15:18

To interactively test my python script, I would like to create a Namespace object, similar to what would be returned by argparse.parse_args(). The

相关标签:
3条回答
  • 2020-12-04 15:45

    It is now recommended to use SimpleNamespace from the types module. It does the same thing as the accepted answer except for it will be faster and have a few more builtins such as equals and repr.

    from types import SimpleNamespace
    
    sn = SimpleNamespace()
    sn.a = 'test'
    sn.a
    
    # output
    'test'
    
    0 讨论(0)
  • 2020-12-04 15:59

    argparse documentation show various examples of what you're trying to do:

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("-a")
    parser.parse_args(['-a 12'])
    >>> Namespace(a=' 12')
    
    0 讨论(0)
  • 2020-12-04 16:00

    You can create a simple class:

    class Namespace:
        def __init__(self, **kwargs):
            self.__dict__.update(kwargs)
    

    and it'll work the exact same way as the argparse Namespace class when it comes to attributes:

    >>> args = Namespace(a=1, b='c')
    >>> args.a
    1
    >>> args.b
    'c'
    

    Alternatively, just import the class; it is available from the argparse module:

    from argparse import Namespace
    
    args = Namespace(a=1, b='c')
    

    As of Python 3.3, there is also types.SimpleNamespace, which essentially does the same thing:

    >>> from types import SimpleNamespace
    >>> args = SimpleNamespace(a=1, b='c')
    >>> args.a
    1
    >>> args.b
    'c'
    

    The two types are distinct; SimpleNamespace is primarily used for the sys.implementation attribute and the return value of time.get_clock_info().

    Further comparisons:

    • Both classes support equality testing; for two instances of the same class, instance_a == instance_b is true if they have the same attributes with the same values.
    • Both classes have a helpful __repr__ to show what attributes they have.
    • Namespace() objects support containment testing; 'attrname' in instance is true if the namespace instance has an attribute namend attrname. SimpleNamespace does not.
    • Namespace() objects have an undocumented ._get_kwargs() method that returns a sorted list of (name, value) attributes for that instance. You can get the same for either class using sorted(vars(instance).items()).
    • While SimpleNamespace() is implemented in C and Namespace() is implemented in Python, attribute access is no faster because both use the same __dict__ storage for the attributes. Equality testing and producing the representation are a little faster for SimpleNamespace() instances.
    0 讨论(0)
提交回复
热议问题