Python:从arg解析器到字典
我在Python3.8中有一个名为“stores.py”的文件。这个文件有一个名为“scan_transactions”的方法,它接受两个位置参数:“store”和“checkpoint”。该方法基本上通过使用正则表达式模式扫描PostgreSQL表中的存储事务。当代码到达事务表中该特定存储的最后一个事务id时,将使用并更新另一个表(检查点表),以指示任何给定存储的最新最大事务id 目前,我正在从一个预定义的字典(类似于下面的字典)传递这两个参数:Python:从arg解析器到字典,python,json,argparse,Python,Json,Argparse,我在Python3.8中有一个名为“stores.py”的文件。这个文件有一个名为“scan_transactions”的方法,它接受两个位置参数:“store”和“checkpoint”。该方法基本上通过使用正则表达式模式扫描PostgreSQL表中的存储事务。当代码到达事务表中该特定存储的最后一个事务id时,将使用并更新另一个表(检查点表),以指示任何给定存储的最新最大事务id 目前,我正在从一个预定义的字典(类似于下面的字典)传递这两个参数: dict_stores = {'store1'
dict_stores = {'store1': 'checkpoint_store1', 'store2': 'checkpoint_store2','store3': 'checkpoint_store3'}
当前代码如下所示:
def store_transactions(store: str, checkpoint_name: str)
.
.
.
.
.
if __name__ == '__main__':
for store, checkpoint in shops.dict_stores.items():
LOG.debug(f'Processing store : {store}, checkpoint: {checkpoint}')
store_transactions(store, checkpoint)
我现在希望使其更具动态性,并允许用户在执行之前将要处理事务的存储作为批处理作业传递。这将使用下面的命令行:
"stores.py" --stores -store1 -store2 -store3...etc.
然后,上面的命令将替换这个预先固定的字典并动态创建一个字典。有人知道我如何使用“arg parser”以某种方式通过编程将参数“-shop1”,““-shop2”转换为类似于上面的字典(其各自的检查点作为值),并使用当前运行的同一循环处理所有存储吗?我发现使用一种在
上拆分的结构很方便,
阅读可能性列表
def parse_args(args_external=None):
“”“从用户输入生成具有所需属性的arguments对象”“”
parser=argparse.ArgumentParser(
description=“示例程序”,
)
parser.add_参数(
“--foo”,
默认值=”,
help=“以逗号分隔的条形图集合”)
arguments=parser.parse_args(args_external)#启用自动测试(否则无->sys.argv)
_foo=[]
对于arguments.foo.split(“,”)中的条:
如果不是条:#允许跳过,,
持续
validatebar(bar)#如果无效,则返回消息退出系统
arguments.foo=_foo#删除原始引用
这就像
python3./myscript.py--foobar1、bar2、bar3
我发现使用一个在,
上拆分的结构来阅读一个可能性列表很方便
def parse_args(args_external=None):
“”“从用户输入生成具有所需属性的arguments对象”“”
parser=argparse.ArgumentParser(
description=“示例程序”,
)
parser.add_参数(
“--foo”,
默认值=”,
help=“以逗号分隔的条形图集合”)
arguments=parser.parse_args(args_external)#启用自动测试(否则无->sys.argv)
_foo=[]
对于arguments.foo.split(“,”)中的条:
如果不是条:#允许跳过,,
持续
validatebar(bar)#如果无效,则返回消息退出系统
arguments.foo=_foo#删除原始引用
这就像
python3./myscript.py--foobar1、bar2、bar3
注意,我认为您需要使用位置argparse参数来重复它们(即,您没有--store选项名称)。或者,也许我对OptPass感到困惑,因为我现在主要使用Click
文档的这一部分涵盖了这一点,因此看起来您也可以使用--store
。没有非常清楚的例子。也就是说,对于用户来说,这需要更多的输入,所以我会选择位置
import argparse
#the existing dictionary
lookup = {'store1': 'checkpoint_store1', 'store2': 'checkpoint_store2','store3': 'checkpoint_store3'}
#from doc @ https://docs.python.org/3/library/argparse.html#example
parser = argparse.ArgumentParser(description='Process some stores.')
#Option 1 your loop checks for valid stores
# parser.add_argument('stores', type=str, nargs='+', help='stores')
#Option2 argparse checks for valid stores
parser.add_argument('stores', type=str, nargs='+', help='stores', choices=lookup.keys())
args = parser.parse_args()
user_stores = args.stores
dict_stores = {}
#check in loop
for store in user_stores:
try:
dict_stores[store] = lookup[store]
#pragma: no cover pylint: disable=unused-variable
except (KeyError,) as e:
print(f" unknown store {store}. known : {' '.join(lookup.keys())}")
# if you use argparse to check this can be simplified to
# dict_stores[store] = {store: lookup[store] for store in user_stores}
print(f"{dict_stores}")
输出:
注意,我认为您需要使用位置argparse参数来重复它们(即,您没有--store选项名称)。或者,也许我对OptPass感到困惑,因为我现在主要使用Click 文档的这一部分涵盖了这一点,因此看起来您也可以使用
--store
。没有非常清楚的例子。也就是说,对于用户来说,这需要更多的输入,所以我会选择位置
import argparse
#the existing dictionary
lookup = {'store1': 'checkpoint_store1', 'store2': 'checkpoint_store2','store3': 'checkpoint_store3'}
#from doc @ https://docs.python.org/3/library/argparse.html#example
parser = argparse.ArgumentParser(description='Process some stores.')
#Option 1 your loop checks for valid stores
# parser.add_argument('stores', type=str, nargs='+', help='stores')
#Option2 argparse checks for valid stores
parser.add_argument('stores', type=str, nargs='+', help='stores', choices=lookup.keys())
args = parser.parse_args()
user_stores = args.stores
dict_stores = {}
#check in loop
for store in user_stores:
try:
dict_stores[store] = lookup[store]
#pragma: no cover pylint: disable=unused-variable
except (KeyError,) as e:
print(f" unknown store {store}. known : {' '.join(lookup.keys())}")
# if you use argparse to check this can be simplified to
# dict_stores[store] = {store: lookup[store] for store in user_stores}
print(f"{dict_stores}")
输出:
另一种解决方案:只需读取一个JSON配置文件,可能将参数设置为
stdin的文件名或触发器
导入json
...
打开(路径配置)为fh时:
config=json.load(fh)#config现在是一个Python dict
替代解决方案:只需读取一个JSON配置文件,可能使参数成为stdin的文件名或触发器
导入json
...
打开(路径配置)为fh时:
config=json.load(fh)#config现在是一个Python dict
这更像是一个列表;这就是默认行为hi@crissal你能再详细一点吗?argparse
文档解释了args=parser.parse_args()
解析sys.argv
列表(来自shell/解释器),并返回名称空间
对象vars(args)
将该对象转换为dict
。您可以轻松地从任何一个数据库获取值。您还可以传递类似的字符串列表,而不是sys.argv
。它的形式是supermarkes.py--stores store1 store2…
。它减去了单破折号,但您不需要传统上取消标记单字符标志的单破折号。因此,基本上,您希望通过argparse
?你不妨把所有关于博士后和超市的话题都去掉,这样会分散你的注意力。但将store1、checkpoint_store1等作为示例对并没有什么错;这就是默认行为hi@crissal你能再详细一点吗?argparse
文档解释了args=parser.parse_args()
解析sys.argv
列表(来自shell/解释器),并返回名称空间
对象vars(args)
将该对象转换为dict
。您可以轻松地从任何一个数据库获取值。您还可以传递类似的字符串列表,而不是sys.argv