Python 参数和在参数中传递浮点数
Python Arguments and Passing Floats in Arguments
我已经 运行 解决了一些在 python 脚本中使用参数的问题。我能否获得一些帮助或指导以使此代码正常运行?提前谢谢你。
第一个问题:我无法一次指定多个参数。
例如,我可以很好地传递一个参数:
$ ./my_arg_scenario.py -a
Argument_A
$ ./my_arg_scenario.py -c
Argument_C
$ ./my_arg_scenario.py -d
Argument_D
但是,我正在寻找一种在任何位置传递多个参数的方法。有什么办法可以做到这一点?
例如,我希望发生以下情况:
./my_arg_scenario.py -a -c -d
Argument_A
Argument_C
Argument_D
# OR
./my_arg_scenario.py -c -a
Argument_C
Argument_A
第二个问题:我试图在 -b 参数中传递整数和浮点数。但是,当我传递 float/decimal 时,出现以下错误。有什么方法可以同时传递浮点数和整数吗?
这个有效:
$ ./my_arg_scenario.py -b 5
The number provided is: 5
但这不是:
$ ./my_arg_scenario.py -b 5.50
Traceback (most recent call last):
File "./my_arg_scenario.py", line 18, in <module>
if int(sys.argv[2]) not in range(0,11):
ValueError: invalid literal for int() with base 10: '5.50'
下面是我的可测试代码:
#!/usr/local/bin/python3.5
import sys
script_options = ['-a', '-b', '-c', '-d']
manual_flag = ''
build_flag = ''
if len(sys.argv) > 1:
if sys.argv[1] in script_options:
pass
else:
print('\n\t\tParameter "' + sys.argv[1] + '" is an invalid argument.\n')
sys.exit()
if sys.argv[1] == '-a':
print('Argument_A')
sys.exit()
elif sys.argv[1] == '-b':
if int(sys.argv[2]) not in range(0,11):
print('Invalid interval. Please select a value bewteen 1-5s.')
sys.exit()
else:
print('The number provided is: ' + (sys.argv[2]))
elif sys.argv[1] == '-c':
manual_flag = 'Argument_C'
print(manual_flag)
elif sys.argv[1] == '-d':
build_flag ='Argument_D'
print(build_flag)
else:
pass
你实际上并没有提供你正在使用的代码(除了在回溯中顺便说一句),(更新:代码稍后添加)但答案是:停止手动解析 sys.argv
并使用 the argparse
module(或 docopt
或不涉及滚动您自己的开关解析的东西)。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-a', action='store_true')
parser.add_argument('-b', metavar='INTERVAL', type=int, choices=range(11))
parser.add_argument('-c', action='store_true')
parser.add_argument('-d', action='store_true')
args = parser.parse_args()
if args.a: print('Argument_A')
if args.b is not None: print('The number provided is:', args.b)
if args.c: print('Argument_C')
if args.d: print('Argument_D')
如果你想接受 int
或 float
,最简单的解决方案是只制作 type=float
并使用一致的类型(但 range
检查必须是在解析步骤之外完成)。如果你必须允许两者,ast.literal_eval
或自制的 argparse
类型转换函数是选项。由于您也需要范围检查(对于 float
不等于 int
值的值,range
无法正确处理),请滚动类型检查器:
def int_or_float(minval=None, maxval=None):
def checker(val):
try:
val = int(val)
except ValueError:
val = float(val)
if minval is not None and val < minval:
raise argparse.ArgumentTypeError('%r must be >= %r' % (val, minval))
if maxval is not None and val > maxval:
raise argparse.ArgumentTypeError('%r must be <= %r' % (val, maxval))
return val
return checker
然后通过将 -b
的定义替换为:
来使用它
# Might want int_or_float(0, 10) depending on range exclusivity rules
parser.add_argument('-b', metavar='INTERVAL', type=int_or_float(0, 11))
我已经 运行 解决了一些在 python 脚本中使用参数的问题。我能否获得一些帮助或指导以使此代码正常运行?提前谢谢你。
第一个问题:我无法一次指定多个参数。 例如,我可以很好地传递一个参数:
$ ./my_arg_scenario.py -a
Argument_A
$ ./my_arg_scenario.py -c
Argument_C
$ ./my_arg_scenario.py -d
Argument_D
但是,我正在寻找一种在任何位置传递多个参数的方法。有什么办法可以做到这一点? 例如,我希望发生以下情况:
./my_arg_scenario.py -a -c -d
Argument_A
Argument_C
Argument_D
# OR
./my_arg_scenario.py -c -a
Argument_C
Argument_A
第二个问题:我试图在 -b 参数中传递整数和浮点数。但是,当我传递 float/decimal 时,出现以下错误。有什么方法可以同时传递浮点数和整数吗?
这个有效:
$ ./my_arg_scenario.py -b 5
The number provided is: 5
但这不是:
$ ./my_arg_scenario.py -b 5.50
Traceback (most recent call last):
File "./my_arg_scenario.py", line 18, in <module>
if int(sys.argv[2]) not in range(0,11):
ValueError: invalid literal for int() with base 10: '5.50'
下面是我的可测试代码:
#!/usr/local/bin/python3.5
import sys
script_options = ['-a', '-b', '-c', '-d']
manual_flag = ''
build_flag = ''
if len(sys.argv) > 1:
if sys.argv[1] in script_options:
pass
else:
print('\n\t\tParameter "' + sys.argv[1] + '" is an invalid argument.\n')
sys.exit()
if sys.argv[1] == '-a':
print('Argument_A')
sys.exit()
elif sys.argv[1] == '-b':
if int(sys.argv[2]) not in range(0,11):
print('Invalid interval. Please select a value bewteen 1-5s.')
sys.exit()
else:
print('The number provided is: ' + (sys.argv[2]))
elif sys.argv[1] == '-c':
manual_flag = 'Argument_C'
print(manual_flag)
elif sys.argv[1] == '-d':
build_flag ='Argument_D'
print(build_flag)
else:
pass
你实际上并没有提供你正在使用的代码(除了在回溯中顺便说一句),(更新:代码稍后添加)但答案是:停止手动解析 sys.argv
并使用 the argparse
module(或 docopt
或不涉及滚动您自己的开关解析的东西)。
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-a', action='store_true')
parser.add_argument('-b', metavar='INTERVAL', type=int, choices=range(11))
parser.add_argument('-c', action='store_true')
parser.add_argument('-d', action='store_true')
args = parser.parse_args()
if args.a: print('Argument_A')
if args.b is not None: print('The number provided is:', args.b)
if args.c: print('Argument_C')
if args.d: print('Argument_D')
如果你想接受 int
或 float
,最简单的解决方案是只制作 type=float
并使用一致的类型(但 range
检查必须是在解析步骤之外完成)。如果你必须允许两者,ast.literal_eval
或自制的 argparse
类型转换函数是选项。由于您也需要范围检查(对于 float
不等于 int
值的值,range
无法正确处理),请滚动类型检查器:
def int_or_float(minval=None, maxval=None):
def checker(val):
try:
val = int(val)
except ValueError:
val = float(val)
if minval is not None and val < minval:
raise argparse.ArgumentTypeError('%r must be >= %r' % (val, minval))
if maxval is not None and val > maxval:
raise argparse.ArgumentTypeError('%r must be <= %r' % (val, maxval))
return val
return checker
然后通过将 -b
的定义替换为:
# Might want int_or_float(0, 10) depending on range exclusivity rules
parser.add_argument('-b', metavar='INTERVAL', type=int_or_float(0, 11))