Python 3.x 是否可以在解析期间将ConfigParser选项转换为类型?

Python 3.x 是否可以在解析期间将ConfigParser选项转换为类型?,python-3.x,jinja2,Python 3.x,Jinja2,使用实例时,可以通过其getint、getfloat和getboolean方法将选项显式转换为类型。通过为构造函数的converters命名参数传递适当的值,可以扩展受支持类型的列表 所以显式很好地工作 现在考虑下面的脚本,包含一个 .ini >代码>文件和一个jja2模板内联: #!/usr/bin/env python3 import sys assert sys.version_info[:2] >= (3, 5), "Need at least Python 3.5" from c

使用实例时,可以通过其
getint
getfloat
getboolean
方法将选项显式转换为类型。通过为构造函数的
converters
命名参数传递适当的值,可以扩展受支持类型的列表

所以显式很好地工作

现在考虑下面的脚本,包含一个<代码> .ini >代码>文件和一个jja2模板内联:

#!/usr/bin/env python3
import sys
assert sys.version_info[:2] >= (3, 5), "Need at least Python 3.5"
from configparser import ConfigParser
from io import StringIO
from jinja2 import Template

INI_FILE = """\
[section]
option1 = yes
option2 = no"""

TPL_FILE = """\
From loop:
{% for opt in cfg.options("section") -%}
{{ opt }} = {{ cfg.get("section", opt) }}
{% endfor -%}
Directly:
option1 = {{ cfg.section.option1 }}
option2 = {{ cfg.section.option2 }}
real true = {{ realt }}
real false = {{ realf }}
"""

if __name__ == "__main__":
    cfg = ConfigParser()
    cfgfile = StringIO(INI_FILE)
    cfg.read_file(cfgfile)
    # cfg["section"]["option3"] = True <- must be string
    # cfg["section"]["option4"] = False <- ditto
    tpl = Template(TPL_FILE)
    print(tpl.render(cfg=cfg, realt=True, realf=False))
现在,我如何实现每当访问
option1
option2
时,它们都被视为布尔值,就像我分别在名称
realt
realf
下传递的布尔值一样

ConfigParser
似乎将所有内容都视为字符串

我看到两种方法来实现我想要的

  • 一种方法是编写一个Jinja2过滤器,它接受允许使用的各种字符串形式(显然是由用户识别的)
  • 另一种方法是派生
    ConfigParser
    ,并以某种方式实现此行为
  • 但是,看到方法1会复制代码(并且我的代码不会随着
    ConfigParser
    中的代码自动更改,因此实现可能会出现分歧);方法2最终可能会在几个地方复制信息,我想知道Python的电池包含方法是否包含了我所缺少的内容


    如何使
    获取
    设置
    设置项
    获取项
    了解
    配置解析器
    支持的标准类型(
    int
    float
    boolean
    )?这里我还缺少哪些其他方法?

    目前,我正在接受一个定制的Jinja2过滤器,它接受字符串值作为输入,并使用
    ConfigParser
    将其解析为布尔值。不过,我觉得这很难看,我还是希望其他人能给我一个更好的答案

    def my_filter(optvalue):
        assert isinstance(optvalue, str), "We expect only string values as input from ConfigParser"
        from configparser import ConfigParser, DEFAULTSECT
        cfg = ConfigParser()
        cfg.read_string("[%s]\n%s = %s\n" % (DEFAULTSECT, DEFAULTSECT, optvalue))
        return cfg.getboolean(DEFAULTSECT, DEFAULTSECT)
    
    我现在可以这样做(假设过滤器注册为
    asbool
    ):

    。。。或在以下情况下:

    {% if cfg.section.option2|asbool %}
    something ...
    {% endif %}
    

    目前,我正在接受一个定制的Jinja2过滤器,它接受一个字符串值作为输入,并使用
    ConfigParser
    将其解析为布尔值。不过,我觉得这很难看,我还是希望其他人能给我一个更好的答案

    def my_filter(optvalue):
        assert isinstance(optvalue, str), "We expect only string values as input from ConfigParser"
        from configparser import ConfigParser, DEFAULTSECT
        cfg = ConfigParser()
        cfg.read_string("[%s]\n%s = %s\n" % (DEFAULTSECT, DEFAULTSECT, optvalue))
        return cfg.getboolean(DEFAULTSECT, DEFAULTSECT)
    
    我现在可以这样做(假设过滤器注册为
    asbool
    ):

    。。。或在以下情况下:

    {% if cfg.section.option2|asbool %}
    something ...
    {% endif %}