How do I create a Python namespace (argparse.parse_args value)?
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 namendattrname
.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 usingsorted(vars(instance).items())
. - While
SimpleNamespace()
is implemented in C andNamespace()
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 forSimpleNamespace()
instances.
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'