目前,jinja2 需要定义 _path 或 get_filenames: https :
pytest 断言重写器既没有定义(参见 https://github.com/pytest-dev/pytest/blob/master/src/_pytest/assertion/rewrite.py#L48),也没有在源代码上运行测试套件具有以下全局性:
from jinja2 import PackageLoader
LOADER = PackageLoader(__name__, "templates")
将失败:
raise ValueError(
E ValueError: The 'xxx' package was not installed in a way that PackageLoader understands.
不确定这里jinja2是否需要支持更多获取模板根的方法,或者pytest loader缺少一些方法。
这似乎与#1148有关。 我们放弃了pkg_resources
,现在使用pkgutil.get_loader()
和loader.get_filename()
。 如果 Pytest 的加载器提供get_filename
它应该可以工作。
这是我们检测包的地方,周围代码中还有一些解决方法来支持 zip 和命名空间导入: https :
正如我在第一篇文章中指出的那样,Pytest 的加载程序没有提供get_filename 。 你确定它必须适用于任何装载机吗?
jinja2 正在对不属于PEP 451 的加载器做出假设——它可能应该使用 pep451+ 世界中模块规范的.origin
属性
我们需要一种方法来获取包中文件的路径以便加载它们。 这似乎是使用 Python 提供的 API 做到这一点的方法,但不可否认,关于如何使用这些 API 做任何事情的文档对我来说几乎是难以理解的。
如果有人有更好的建议,可以在支持目录、zip 和命名空间的同时更好地使用不同的加载程序,我将不胜感激。
抄送@jaraco
如果你想加载一些资源,你不应该使用https://docs.python.org/3/library/importlib.html#module -importlib.resources; 你不需要知道文件的来源,只需要知道它包含什么,不是吗?
resources
要求所有“资源”目录都具有__init__.py
文件,这与 Jinja 的工作方式更加不兼容。 有关我的反馈,请参阅https://gitlab.com/python-devs/importlib_resources/issues/58#note_232533726 。
这可能是一个有用的起点,我会看看我是否可以将一些代码放入 jinja2 中: https: //github.com/asottile/aspy.refactor_imports/blob/519ee18ea75e0045b9b53644c627c6817b2a0748/aspy/classify.pyL17L/
似乎这可能是imporltib.resources
的初始设计的遮挡; 以目前的形式采用它,虽然会导致 jinja2 的功能回归; 即突然不再支持pytest; 所以是的,可能应该添加@asottile链接代码来填补空白,同时上游添加支持。
看起来importlib_resources
有一个允许子目录的更新? https://importlib-resources.readthedocs.io/en/latest/changelog%20 (links).html#v1-1-0 也可以看看。
没关系,这个问题仍然有效。
在 #1182 中恢复为 2.11.2 使用 pkg_resources,将使用 #1169 用于 3.0。
我们可以发布这个吗?
等待另一个 PR。
你能链接它吗? 😄
鉴于里程碑,我怀疑它是 #1183
刚刚发布的 2.11.2 恢复了更改。 3.0 将具有修复的新行为。