Jach Feng 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

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

Just can't figure out where is wrong!?

First, you need to add an argument to the parser, so that it expects an argument:
>>> parser.add_argument("expression")

Secondly, `parse_args` expects a list of arguments. By passing a string, it interprets each character as a separate argument (since iterating over a string yields each character in turn). Here, I intentionally leave off the initial hyphen because that's the next problem:
>>> parser.parse_args(["4^2+5.3*abs(-2-1)/2"])
Namespace(expression='4^2+5.3*abs(-2-1)/2')

Thirdly, an initial hyphen indicates an optional argument so, for example if you pass "-l" it will expect a "-l" argument to be defined as one of the valid options, and also complain that you haven't specified the required expression:
>>> parser.parse_args(["-4^2+5.3*abs(-2-1)/2"])
usage: [-h] expression
: error: the following arguments are required: expression

If you need to pass a value starting with a "-" there are a couple of options...

Perhaps it would be acceptable to represent it as "0-...":
>>> parser.parse_args(["0-4^2+5.3*abs(-2-1)/2"])
Namespace(expression='0-4^2+5.3*abs(-2-1)/2')

While mathematically equivalent, that might have different meaning for whatever you're trying to do. Alternatively, a double hyphen indicates that there are no more options and that anything else is positional arguments even if they begin with a hyphen:
>>> parser.parse_args(["--", "-4^2+5.3*abs(-2-1)/2"])
Namespace(expression='-4^2+5.3*abs(-2-1)/2')

You wouldn't usually explicitly pass a list of arguments to `parse_args` like that, but it can be useful for testing and experimentation. Usually, you'd call `parse_args()` without any arguments, and it would parse the arguments passed on the command-line when calling your script. e.g. you'd call (from a Windows command prompt / Linux shell / etc.):
> ./convert_infix.py -- '-4^2+5.3*abs(-2-1)/2'
(it's probably a good idea to quote the expression, in case it includes any characters which would be interpreted specially by the shell - e.g. "*" without quotes usually expands to all matching files in the current directory)

--
Mark.
--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to