Python UUID - 使用命名空间处理 URN

Posted

技术标签:

【中文标题】Python UUID - 使用命名空间处理 URN【英文标题】:Python UUID - Handle URN with namespace 【发布时间】:2018-08-29 02:18:50 【问题描述】:

在要处理的输入 XML 中,我有一个 URN UUID 作为文件标识符:

urn:vendor:processor:uuid:0269803d-50c4-46b0-9f50-60ef7fe3e22b

我需要检查此 UUID 是否有效,但 vendor:processor: 部分会使标准模块引发错误:

# same UUID in different flavors
x = "0269803d50c446b09f5060ef7fe3e22b"
y = "urn:uuid:0269803d-50c4-46b0-9f50-60ef7fe3e22b"
z = "urn:vendor:processor:uuid:0269803d-50c4-46b0-9f50-60ef7fe3e22b"

# testing different ways
uuid.UUID(x)
>>> UUID('0269803d-50c4-46b0-9f50-60ef7fe3e22b')  # yipee
uuid.UUID(y)
>>> UUID('0269803d-50c4-46b0-9f50-60ef7fe3e22b')  # yipee 2
uuid.UUID(z)
>>> Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "C:\Users\USER\AppData\Local\Programs\Python\Python36\lib\uuid.py", line 140, in __init__
        raise ValueError('badly formed hexadecimal UUID string')
      ValueError: badly formed hexadecimal UUID string

如何指定 vendor:processor: 是 UUID 命名空间的一部分(不确定这个术语是否正确)?

环境:Python 3.6.4 64 位 - Win10

【问题讨论】:

你能告诉我们哪个python版本吗? 当然,Python 3.6.4 64 位 - Win10。它在回溯路径中,但现在更容易了:) 字符串中的z 字符也是错字吗?例如x=...ez7...? 【参考方案1】:

根据手册,UUID URNs 应该符合 RFC4122。现在,据我所知,RFC 不支持此类“前缀”,因此我认为您将不得不手动解析该 URN。示例代码:

import uuid

# Returns a tuple (<uuid>, <prefix>)
def urn_uuid_decode(urn_str):
    parts = urn_str.split(":")

    # Already supported format
    if len(parts) < 4:
        return uuid.UUID(urn_str), None


    return uuid.UUID("%s:%s:%s" % (parts[0], parts[-2], parts[-1])), ":".join(parts[1:-2])

# same UUID in different flavors
x = "0269803d50c446b09f5060ef7fe3e22b"
y = "urn:uuid:0269803d-50c4-46b0-9f50-60ef7fe3e22b"
z = "urn:vendor:processor:uuid:0269803d-50c4-46b0-9f50-60ef7fe3e22b"

print(urn_uuid_decode(x))
print(urn_uuid_decode(y))
print(urn_uuid_decode(z))

输出:

(UUID('0269803d-50c4-46b0-9f50-60ef7fe3e22b'), None)
(UUID('0269803d-50c4-46b0-9f50-60ef7fe3e22b'), None)
(UUID('0269803d-50c4-46b0-9f50-60ef7fe3e22b'), 'vendor:processor')

希望对你有帮助

【讨论】:

谢谢,我同时做了匹配的解决方法。很高兴得到确认:)

以上是关于Python UUID - 使用命名空间处理 URN的主要内容,如果未能解决你的问题,请参考以下文章

Python生成UUID

Django生成唯一字符串UUID与MD5

在uuid5实现中是否必须使用名称空间?

Python使用UUID库生成唯一ID

python使用uuid库生成唯一id

Python使用UUID库生成唯一ID