gpt4 book ai didi

python - 从配置文件中读取 bool 条件?

转载 作者:太空宇宙 更新时间:2023-11-03 12:41:04 24 4
gpt4 key购买 nike

在 Python 中使用 ConfigParser 从配置文件中读取条件的最佳方法是什么?和 json ?我想读这样的东西:

[mysettings]
x >= 10
y < 5

然后将它应用到代码中 xy是已定义的变量,条件将应用于 x, y 的值在代码中。像这样的东西:

l = get_lambda(settings["mysettings"][0])
if l(x):
# do something
pass
l2 = get_lambda(settings["mysettings"][1])
if l2(y):
# do something
pass

理想情况下,我想指定条件,例如 x + y >= 6也是。

一定有更好的方法,但想法是使用配置文件中的简单 bool 表达式来限制变量的值。

最佳答案

我认为您不希望或不需要同时使用 configparser json,因为两者本身就足够了。以下是如何处理每一个:

假设您有一个来自可信 来源的配置文件,其中包含如下内容:

myconfig.ini

[mysettings]
other=stuff
conds=
x >= 10
y < 5
x + y >= 6

它可以这样解析和使用:

from __future__ import print_function
try:
import configparser
except ImportError: # Python 2
import ConfigParser as configparser

get_lambda = lambda expr: lambda **kwargs: bool(eval(expr, kwargs))

cp = configparser.ConfigParser()
cp.read('myconfig.ini')

exprs = cp.get('mysettings', 'conds').strip()
conds = [expr for expr in exprs.split('\n')]

l = get_lambda(conds[0])
l2 = get_lambda(conds[1])
l3 = get_lambda(conds[2])

def formatted(l, c, **d):
return '{:^14} : {:>10} -> {}'.format(
', '.join('{} = {}'.format(var, val) for var, val in sorted(d.items())), c, l(**d))

l = get_lambda(conds[0])
print('l(x=42): {}'.format(l(x=42)))
print()
print(formatted(l, conds[0], x=42))
print(formatted(l2, conds[1], y=6))
print(formatted(l3, conds[2], x=3, y=4))

这将导致以下输出:

l(x=42): True

x = 42 : x >= 10 -> True
y = 6 : y < 5 -> False
x = 3, y = 4 : x + y >= 6 -> True

如果信息被保存在类似这样的 JSON 格式文件中:

myconfig.json

{
"mysettings": {
"other": "stuff",
"conds": [
"x >= 10",
"y < 5",
"x + y >= 6"
]
}
}

它可以很容易地用 json 模块解析并以类似的方式使用:

import json

with open('myconfig.json') as file:
settings = json.loads(file.read())

conds = settings['mysettings']['conds']

...余数将相同并产生相同的结果。即:

l = get_lambda(conds[0])
print('l(x=42): {}'.format(l(x=42)))
print()
print(formatted(l, conds[0], x=42))
print(formatted(l2, conds[1], y=6))
print(formatted(l3, conds[2], x=3, y=4))

关于python - 从配置文件中读取 bool 条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13750008/

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