首页 > 解决方案 > 是否存在类似 Nonetype 路径的东西?

问题描述

在我的课程中,我喜欢使用 None 来启动我的路径变量。如果我使用os.path它很容易与其他路径进行比较。但我更喜欢 pathlib 风格。

有没有解决方案来做到这一点:

import os

path1 = os.path.dirname('D\\test\\file.py')
path2 = None

if path1 == path2:
    print('OK')

使用路径库?

我的尝试是这样的:

from pathlib import Path

test1 = Path('D/test/file.py')
test2 = Path(None)

if test1.resolve() == test2.resolve():
    print('ok')

但这不起作用,因为Path()不接受None并且None没有方法resolve()

标签: python-3.xpathlib

解决方案


你可以给自己一个哨兵,他的resolve方法返回None来做你的检查。

例子:

from pathlib import Path

# You can use type to quickly create a throwaway class with a resolve method
NonePath = type('NonePath', (), {'resolve': lambda: None})

test1 = Path('D/test/file.py')
test2 = NonePath

if test1.resolve() == test2.resolve():
    print('ok')
elif test2.resolve() is None: # returning None allows you to do your check
    print('test2 is NonePath')

您可以走得更远,并__dict__从中提取Path并交换所有方法和属性,None但这似乎有点矫枉过正。

免责声明:这可能是个坏主意

from pathlib import Path
# this changes all methods to return None
# and sets all attributes to None
# if they aren't dunder methods or attributes
path_dict = {k: lambda: None if callable(v) else None 
             for k, v in Path.__dict__.items() 
             if not k.startswith('__')}

NonePath = type('NonePath', (), path_dict)

推荐阅读