如何将None关键字作为命令行参数传递

时间:2018-01-17 06:55:57

标签: python

我正在尝试将None关键字作为命令行参数传递给脚本,如下所示,如果我明确提到Category=None它可以工作,但是当我切换到sys.argv[1]它失败时,关于如何解决这个问题的任何指示?

category = None --> works
#category=sys.argv[1] --> doesn't work 

所以我尝试了如下,仍然无法正常工作

  if sys.argv[1].strip()==None:
    category = None
else:
    category=sys.argv[1].strip()

命令行通道:

 script.py None

3 个答案:

答案 0 :(得分:4)

正如Stephen所说,None不是字符串,因此在将str类型与NoneType类型进行比较时,结果将始终为False

如果我只是在比较的右侧"附近None,我们会得到:

import sys

if sys.argv[1].strip() == "None":
    category = None
else:
    category = sys.argv[1].strip()

print(category)
print(type(category))

导致:

~/temp $ python script.py 123
123
<type 'str'>
~/temp $ python script.py None
None
<type 'NoneType'>

argparse代替?

但是,我建议您使用argparse,如果您有能力这样做的话。我一直都在使用它。

以上代码可以替换为:

import argparse

parser = argparse.ArgumentParser(description='Do some cool stuff.')

def none_or_str(value):
    if value == 'None':
        return None
    return value

parser.add_argument('category', type=none_or_str, nargs='?', default=None,
                    help='the category of the stuff')

args = parser.parse_args()

print(args.category)
print(type(args.category))

哪个也不会容忍任何参数

~/temp $ python script.py 
None
<type 'NoneType'>
~/temp $ python script.py 123
123
<type 'str'>
~/temp $ python script.py None
None
<type 'NoneType'>

它会为您自动格式化一些帮助文本!

~/temp $ python script.py --help
usage: script.py [-h] [category]

Do some cool stuff.

positional arguments:
  category    the category of the stuff

optional arguments:
  -h, --help  show this help message and exit

答案 1 :(得分:1)

只是一个FYI。您可以使用 ast module 转换sting&#39;无&#39;到无类型

<强>实施例

if sys.argv[1].strip() == 'None':
     print "Input Arg is None"

func(){<...>}

更快更好的解决方案。

答案 2 :(得分:1)

我认为更合适的方法是检查是否传递了任何参数。如果没有,则将category设置为None,否则设置传递的值。

例如:

if len(sys.argv) == 2: // or >= 2 in case of more parameter
    category = sys.argv[1].strip()
else:
    category = None

因此,如果您只是致电script.py,则类别将设为None 如果您拨打script.py Value,则类别将设置为Value