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

use*_*827 3 python

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

category = None --> works
#category=sys.argv[1] --> doesn't work 
Run Code Online (Sandbox Code Playgroud)

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

  if sys.argv[1].strip()==None:
    category = None
else:
    category=sys.argv[1].strip()
Run Code Online (Sandbox Code Playgroud)

命令行通过:

 script.py None
Run Code Online (Sandbox Code Playgroud)

Fra*_*fin 6

正如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))
Run Code Online (Sandbox Code Playgroud)

导致:

~/temp $ python script.py 123
123
<type 'str'>
~/temp $ python script.py None
None
<type 'NoneType'>
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

也不会容忍任何参数

~/temp $ python script.py 
None
<type 'NoneType'>
~/temp $ python script.py 123
123
<type 'str'>
~/temp $ python script.py None
None
<type 'NoneType'>
Run Code Online (Sandbox Code Playgroud)

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

~/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
Run Code Online (Sandbox Code Playgroud)


Rak*_*esh 3

只是仅供参考。您可以使用ast 模块将 sting 'None' 转换为 None 类型

前任:

import ast
if not ast.literal_eval(sys.argv[1]):
    print "Input Arg is None"
Run Code Online (Sandbox Code Playgroud)

或者

if sys.argv[1].strip() == 'None':
     print "Input Arg is None"
Run Code Online (Sandbox Code Playgroud)

更快更好的解决方案。