【发布时间】:2021-08-26 16:06:03
【问题描述】:
我在 Python 3.8 中有一个名为“stores.py”的文件。该文件有一个名为“scan_transactions”的方法,它采用 2 个位置参数:“store”和“checkpoint”。该方法基本上通过使用 REGEX 模式来扫描 PostgreSQL 表中的存储事务。当代码到达事务表中该特定存储的最后一个事务 id 时,然后使用另一个表(检查点表)并进行更新以指示任何给定存储的最新最大事务 id。
目前,我正在从一个类似于下面的预定义字典中传递两个参数:
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”以某种方式以编程方式将参数“-shop 1”、“-shop2”转换为像上面那样的字典(将它们各自的检查点作为值)并使用相同的循环处理所有商店我目前正在运行?
【问题讨论】:
-
这看起来更像是一个列表;这是默认行为
-
嗨@crissal,你能详细说明一下吗?
-
argparse文档解释说args=parser.parse_args()解析sys.argv列表(来自shell/解释器),并返回一个Namespace对象。vars(args)将该对象转换为dict。您可以轻松地从中获取值。此外,您可以传递类似的字符串列表,而不是sys.argv。 -
Adding Arguments 中的第一个示例似乎是您想要的。它的形式是
supermarkets.py --stores store1 store2 ...。它减去单个破折号,但您不想要传统上标记单个字符标志的单个破折号。 -
所以,基本上,您想通过
argparse传递链接参数对的列表?您不妨删除所有关于 postgres 和超市的讨论,这会分散注意力。不过,将 store1、checkpoint_store1 等作为示例对保留没有错。