Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:从arg解析器到字典_Python_Json_Argparse - Fatal编程技术网

Python:从arg解析器到字典

Python:从arg解析器到字典,python,json,argparse,Python,Json,Argparse,我在Python3.8中有一个名为“stores.py”的文件。这个文件有一个名为“scan_transactions”的方法,它接受两个位置参数:“store”和“checkpoint”。该方法基本上通过使用正则表达式模式扫描PostgreSQL表中的存储事务。当代码到达事务表中该特定存储的最后一个事务id时,将使用并更新另一个表(检查点表),以指示任何给定存储的最新最大事务id 目前,我正在从一个预定义的字典(类似于下面的字典)传递这两个参数: dict_stores = {'store1'

我在Python3.8中有一个名为“stores.py”的文件。这个文件有一个名为“scan_transactions”的方法,它接受两个位置参数:“store”和“checkpoint”。该方法基本上通过使用正则表达式模式扫描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”以某种方式通过编程将参数“-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