gpt4 book ai didi

python - Python 中处理 sys 参数的规范方法是什么?

转载 作者:行者123 更新时间:2023-11-30 23:27:31 24 4
gpt4 key购买 nike

假设我想制作一个哈希脚本:

### some code here

def hashlib_based(path, htype='md5', block_size=2**16):
hash = eval(htype)
with open(path, 'rb') as f:
for block in iter(lambda: f.read(block_size), ''):
hash().update(block)
f.close()
return hash().hexdigest()

### some code here

正如您所看到的,当我从命令行调用脚本时,我有机会使用不同的标志来更改哈希类型或 block 大小(例如 ./myscript.py -sha1 -b 512 some_file.ext )。问题是,我不知道应该如何执行此操作才能使我的代码尽可能干净和可读。我该如何处理sys.argv

首先,如何检查用户是否使用了正确的标志?我需要这样做才能打印出使用消息。我是否制作一个包含所有标志的列表,然后检查用户是否使用该列表中的标志?

我应该在 main() 里面做所有这些事情吗?或者我应该将它们放在不同的函数中?

我应该在标志前面加上连字符减号(例如:-a、-b)还是不加连字符?要检查 sys.argv 中是否存在某个标志,我是否只需执行以下操作:

if '-v' in sys.argv:
verbose = True

因为 sys.argv 有索引,所以忽略标志顺序的最佳方法是什么 - 或者换句话说,应该 ./myscript.py -a -b./myscript.py -b -a 相同?虽然这确实使普通用户的工作变得更容易,但这样做是常见的做法吗?

I saw something similar but for C#. Python中有类似的概念吗?问题是,尽管这些事情很简单,但它们很快就会失控——至少对我来说是这样。我最终搞得一团糟。您解决这个问题的方法是什么?

最佳答案

对于非常简单的用例,例如检查一个参数是否存在,您可以像您所展示的那样进行检查,即:

if '-v' in sys.argv: ...

这是检查参数的快速但肮脏的方法。但是一旦你的项目变得更加严肃,你肯定需要使用参数解析库。

还有一些处理参数解析的方法:有现在已弃用的 getopt (我不会给出链接),最常见的是 argparse它包含在任何 python 发行版中。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('-a', '--a-long', help='a help')
parser.add_argument('-b', '--b-long', help='b help')
args = parser.parse_args()

然后你可以调用你的 script -a -bscript -b -a 这将是等效的。而且,您还可以免费获得 script -h! :-)

不过,我的偏好现在已经结束了 docopt ,恕我直言,对于同一个例子来说,这更简单、更优雅:

"""
My script.

usage:
myscript -a | --along
myscript -b | --blong

Options:
-a --along a help
-b --blong b help
"""

from docopt import docopt
arguments = docopt(__doc__, version='myscript 1.0')
print(arguments)

HTH

关于python - Python 中处理 sys 参数的规范方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22020730/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com