How to make argparse accept "-4^2+5.3*abs(-2-1)/2" string argument?
Cameron Simpson
cs at cskk.id.au
Sun Jan 22 16:13:20 EST 2023
On 21Jan2023 19:11, Jach Feng <jfong at ms4.hinet.net> wrote:
>Fail on command line,
>
>e:\Works\Python>py infix2postfix.py "-4^2+5.3*abs(-2-1)/2"
>usage: infix2postfix.py [-h] [infix]
>infix2postfix.py: error: unrecognized arguments: -4^2+5.3*abs(-2-1)/2
The usual convention for having "nonoption" arguments beginning with a
dash/minus is to explicitly _end_ the option arguments, eg:
py infix2postfix.py -- "-4^2+5.3*abs(-2-1)/2"
That "--" indicates the end of the options, and that what follows should
not be treated as an option. _However_, it requires support in the
script parsing the options. I'm pretty sure argparse gives that support
for free, as does getopt and probably any others implementing "normal
UNIXish options".
SO try adding a "--" argument and see how it behaves.
>Also fail in REPL,
>
>e:\Works\Python>py
>Python 3.8.8 (tags/v3.8.8:024d805, Feb 19 2021, 13:08:11) [MSC v.1928 32 bit (Intel)] on win32
>Type "help", "copyright", "credits" or "license" for more information.
>>>> import argparse
>>>> parser = argparse.ArgumentParser(description='Convert infix notation to postfix')
>>>> parser.parse_args("-4^2+5.3*abs(-2-1)/2")
>usage: [-h]
>: error: unrecognized arguments: - 4 ^ 2 + 5 . 3 * a b s ( - 2 - 1 ) / 2
This is a different error. `parse_args()` expects a list of arguments,
not a single argument. So it has iterated over what you gave it, which
produces a series of single character strings which it has taken to be
individual arguments. Try this:
parser.parse_args(["-4^2+5.3*abs(-2-1)/2"])
and of course:
parser.parse_args(["--", "-4^2+5.3*abs(-2-1)/2"])
You can see this behaviour of strings as:
print(list("abc"))
or:
for s in "abc":
print("s =", repr(s))
Cheers,
Cameron Simpson <cs at cskk.id.au>
More information about the Python-list
mailing list