argparse modify

נתי שטרן nsh531 at gmail.com
Fri Jun 24 08:16:14 EDT 2022


Thanks a lot.
I will read documentation of enum module

בתאריך יום ו׳, 24 ביוני 2022, 14:33, מאת Roel Schroeven ‏<
roel at roelschroeven.net>:

> Op 24/06/2022 om 0:32 schreef Dennis Lee Bieber:
> > On Thu, 23 Jun 2022 18:57:31 +0200, "Dieter Maurer"<dieter at handshake.de>
> > declaimed the following:
> >
> > >??? ???? wrote at 2022-6-23 15:31 +0300:
> > >>how to solve this (argparse)
> >
> > >>    MAXREPEAT = _NamedIntConstant(32,name=str(32))
> > >>TypeError: 'name' is an invalid keyword argument for int()
> > >
> > >This does not look like an `argparse` problem:
> > >the traceback comes from `oracle/RTR.py`.
> >
> >       And the listed code looks quite suspicious to me...
> >
> > >>     class _NamedIntConstant(int):
> > >>         def __init__(cls, value):
> > >>             self = super(_NamedIntConstant, cls).__init__(cls, value)
> > >>             self.name = name
> > >>             return self
> >
> >       There does not appear to be any provision for keyword arguments at
> all.
> > The only use of "name" is to an undefined object.
> >
> The code seems to be a copy of Lib/re/_constants.py (or
> Lib/sre_constants.py before commit
> 1be3260a90f16aae334d993aecf7b70426f98013), but in _constants.py that
> class uses __new__ instead of __init__:
>
>      class _NamedIntConstant(int):
>          def __new__(cls, value, name):
>              self = super(_NamedIntConstant, cls).__new__(cls, value)
>              self.name = name
>              return self
>
>          def __repr__(self):
>              return self.name
>
>          __reduce__ = None
>
> (unless still older versions did use __init__)
>
> It's used there as a kind of enum. I guess that code was originally
> written before Python had enum.Enum. _makecodes() uses it so create
> named int objects from its arguments, with automatically generated
> consecutive int values, places them in the global namespace (feels like
> a code smell to me) and also returns them.
>
>      def _makecodes(*names):
>          items = [_NamedIntConstant(i, name) for i, name in
> enumerate(names)]
>          globals().update({item.name: item for item in items})
>          return items
>
>      # operators
>      OPCODES = _makecodes(
>          # failure=0 success=1 (just because it looks better that way :-)
>          'FAILURE', 'SUCCESS',
>
>          'ANY', 'ANY_ALL',
>          'ASSERT', 'ASSERT_NOT',
>          'AT',
>          # ...
>          )
>
> נתי שטרן, are you trying to use that semi-enum functionality? Most
> likely you're better of using enum.Enum instead.
>
> --
> "You can fool some of the people all the time, and all of the people some
> of the time, but you cannot fool all of the people all of the time."
>          -- Abraham Lincoln
> "You can fool too many of the people too much of the time."
>          -- James Thurber
> --
> https://mail.python.org/mailman/listinfo/python-list
>


More information about the Python-list mailing list