3

I am trying to obtain a string of numbers from argparse. It's optional whether or not the argument -n is provided.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-n', nargs=1) # -n is optional but must come with one and only one argument
args = parser.parse_args()
test = args.n
if test != 'None':
    print("hi " + test) 

The program fails when I do not provide "-n argument", but works fine when I do.

Traceback (most recent call last):
  File "parse_args_test.py", line 7, in <module>
    print("hi " + test) 
TypeError: Can't convert 'NoneType' object to str implicitly

How can I fix this?

Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343
imagineerThat
  • 5,293
  • 7
  • 42
  • 78

3 Answers3

2

Regarding the question from the title, when nargs is used, the returned value of args.n is a list (even if the nargs=1 is used). So when only 1 argument is expected, you may decide to not use nargs at all to avoid returning a list.

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-n')
args = parser.parse_args()
test = args.n
if test:
    print("hi " + test) 
michalmonday
  • 441
  • 5
  • 11
1

Do not try to concatenate None and "hi ":

print("hi", test)

or

print("hi " + (test or ''))

or test if test is set to None explicitly:

if test is not None:
    print("hi", test)
Martijn Pieters
  • 1,048,767
  • 296
  • 4,058
  • 3,343
1

Use "is" when comparing to None. Should look like this:

if test is not None:
    print("hi %s" % test) 
Scorpil
  • 1,422
  • 1
  • 11
  • 14