gpt4 book ai didi

python - 在 doctest 中,有没有办法将 yaml 代码块视为变量?

转载 作者:行者123 更新时间:2023-12-04 08:43:30 24 4
gpt4 key购买 nike

我正在使用 doctest 测试 .rst 文件中的代码片段。在许多情况下,最重要的测试是对 yaml 配置的简单有效性检查。
例如:

>>> my_yaml = """
... foo:
... bar:
... - baz1
... - baz2
... """
>>> my_yaml_dict = yaml.load(my_yaml_string, Loader=yaml.FullLoader)
>>> assert "baz_2" in my_yaml_dict["foo"]["bar"]
为了使代码更具可读性和可复制粘贴,我只想显示 yaml block ,并将测试本身放在隐藏的代码块中。
这有效:
>>> my_yaml = """
... foo:
... bar:
... - baz1
... - baz2
... """

.. invisible-code-block: python

>>> my_yaml_dict = yaml.load(my_yaml_string, Loader=yaml.FullLoader)
>>> assert "baz_2" in my_yaml_dict["foo"]["bar"]
但是,yaml block 仍然封装在 my_yaml="""...""" 中,这使得复制粘贴变得困难。
有没有办法将代码块本身视为变量?我在想像这些方面的东西:
.. code-block:: yaml # doctest: +varname=my_yaml_string

foo:
bar:
- baz1
- baz2

.. invisible-code-block: python

>>> my_yaml_dict = yaml.load(my_yaml_string, Loader=yaml.FullLoader)
>>> assert "baz_2" in my_yaml_dict["foo"]["bar"]

最佳答案

根据文档,我认为更改/跳过文档字符串分隔符( >>> ... )是不可能的:

Any expected output must immediately follow the final '>>> ' or '... ' line containing the code, and the expected output (if any) extends to the next '>>> ' or all-whitespace line.https://docs.python.org/3/library/doctest.html#how-are-docstring-examples-recognized


另一种解决方案可能是将所述 Yaml 数据移动到外部变量,该变量未在 doctest block 中定义:
my_yaml_string = """
foo:
bar:
- baz1
- baz2
"""
然后可以直接从 doctest block 中使用上面的变量:
>>> my_yaml_dict = yaml.load(my_yaml_string, Loader=yaml.FullLoader)
>>> assert "baz_2" in my_yaml_dict["foo"]["bar"]
另外 my_yaml_string可以在另一个模块中定义变量以不影响运行时性能:
>>> import test_constants
>>> my_yaml_dict = yaml.load(test_constants.my_yaml_string, Loader=yaml.FullLoader)
>>> assert "baz_2" in my_yaml_dict["foo"]["bar"]
此外,测试数据可以完全移动到单独的文件中。这具有为所选数据序列化语言(在本例中为 Yaml)启用静态分析器覆盖的额外好处:
# test_data.yaml
foo:
bar:
- baz1
- baz2
>>> my_yaml_dict = yaml.load(open("test_data.yaml"), Loader=yaml.FullLoader)
>>> assert "baz_2" in my_yaml_dict["foo"]["bar"]
请注意 "test_data.yaml"可能需要转换为绝对路径,具体取决于文档测试的执行方式。

关于python - 在 doctest 中,有没有办法将 yaml 代码块视为变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64444924/

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