gpt4 book ai didi

python-3.x - pathlib 路径和 py.test LocalPath

转载 作者:行者123 更新时间:2023-12-04 14:09:31 24 4
gpt4 key购买 nike

我已经开始使用 pathlib.Path前一段时间,我喜欢使用它。现在我已经习惯了,我变得草率,忘记将参数转换为 str .

使用 tox 时经常发生这种情况+ py.test基于 tmpdir 的临时目录(这是一个 py._path.local.LocalPath ):

from pathlib import Path
import pytest

def test_tmpdir(tmpdir):
p = Path(tmpdir) / 'testfile.csv'

而不是插入 str()每次,我都更一般地看着解决这个问题,但不能。

首先,我尝试制作自己的 Path 类,该类具有适应的 _parse_args :
import pytest
from py._path.local import LocalPath
from pathlib import Path, PurePath

def Path(Path):
@classmethod
def _parse_args(cls, args):
parts = []
for a in args:
if isinstance(a, PurePath):
parts += a._parts
elif isinstance(a, str):
# Force-cast str subclasses to str (issue #21127)
parts.append(str(a))
elif isinstance(a, LocalPath):
parts.append(str(a))
else:
raise TypeError(
"argument should be a path or str object, not %r"
% type(a))
return cls._flavour.parse_parts(parts)

def test_subclass(tmpdir):
p = Path(tmpdir) / 'testfile.csv'

这会抛出一个 TypeError: unsupported operand type(s) for /: 'NoneType' and 'str' (也尝试过 PosixPath,结果相同,但不希望特定于 Linux)。

我试图打补丁 Path :
import pytest
from pathlib import Path

def add_tmpdir():
from py._path.local import LocalPath

org_attr = '_parse_args'
stow_attr = '_org_parse_args'

def parse_args_localpath(cls, args):
args = list(args)
for idx, a in enumerate(args):
if isinstance(a, LocalPath):
args[idx] = str(a)
return getattr(cls, stow_attr)(args)

if hasattr(Path, stow_attr):
return # already done
setattr(Path, stow_attr, getattr(Path, org_attr))
setattr(Path, org_attr, parse_args_localpath)

add_tmpdir()

def test_monkeypatch_path(tmpdir):
p = Path(tmpdir) / 'testfile.csv'

这会抛出一个 AttributeError: type object 'Path' has no attribute '_flavour' (也在猴子修补 PurePath 时)。

最后我尝试只包装 Path :
import pytest
import pathlib

def Path(*args):
from py._path.local import LocalPath
args = list(args)
for idx, a in enumerate(args):
if isinstance(a, LocalPath):
args[idx] = str(a)
return pathlib.Path(*args)

def test_tmpdir_path(tmpdir):
p = Path(tmpdir) / 'testfile.csv'

这也给出了 AttributeError: type object 'Path' has no attribute '_flavour'
我想在某个时候这最后一个工作,但我无法重现。
难道我做错了什么?为什么这么难?

最佳答案

如果其他人正在研究 pytest 的 tmpdir路径与 pathlib.Path 配合得很好:

使用 python 3.6.5pytest 3.2.1 ,问题中发布的代码运行良好,无需显式转换为 str :

from pathlib import Path

def test_tmpdir(tmpdir):
p = Path(tmpdir) / 'testfile.csv'

关于python-3.x - pathlib 路径和 py.test LocalPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40784950/

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