Regex 如何将此函数更改为与Python 2和Python 3兼容?I';我遇到了字符串、unicode和其他问题

Regex 如何将此函数更改为与Python 2和Python 3兼容?I';我遇到了字符串、unicode和其他问题,regex,string,python-3.x,unicode,bytecode,Regex,String,Python 3.x,Unicode,Bytecode,我有一个函数,旨在使文件名或URL的某些文本安全。我正在尝试对其进行更改,以使其在Python2和Python3中工作。在我的尝试中,我把自己和字节码搞混了,希望得到一些指导。我遇到了一些错误,比如序列项1:应该是像object一样的字节,str found def slugify( text = None, filename = True, URL = False, return_str = True ): if

我有一个函数,旨在使文件名或URL的某些文本安全。我正在尝试对其进行更改,以使其在Python2和Python3中工作。在我的尝试中,我把自己和字节码搞混了,希望得到一些指导。我遇到了一些错误,比如序列项1:应该是像object一样的字节,str found

def slugify(
    text       = None,
    filename   = True,
    URL        = False,
    return_str = True
    ):

    if sys.version_info >= (3, 0):

        # insert magic here

    else:

        if type(text) is not unicode:
            text = unicode(text, "utf-8")
        if filename and not URL:
            text = unicodedata.normalize("NFKD", text).encode("ascii", "ignore")
            text = unicode(re.sub("[^\w\s-]", "", text).strip())
            text = unicode(re.sub("[\s]+", "_", text))
        elif URL:
            text = unicodedata.normalize("NFKD", text).encode("ascii", "ignore")
            text = unicode(re.sub("[^\w\s-]", "", text).strip().lower())
            text = unicode(re.sub("[-\s]+", "-", text))
        if return_str:
            text = str(text)

    return text

似乎您的主要问题是,当您不确定原始类型是什么时,如何将文本转换为unicode并返回到字节。事实上,如果你小心的话,你不需要任何条件检查就可以做到这一点

if isinstance(s, bytes):
    s = s.decode('utf8')
应该足以在Python2或Python3中将某些内容转换为unicode(通常假设2.6+和3.2+)。这是因为在Python 2中,字节作为字符串的别名存在。显式的
utf8
参数仅在Python2中需要,但在Python3中提供它也没有坏处。然后,要转换回bytestring,只需执行相反的操作

if not isinstance(s, bytes):
    s = s.encode('utf8')

当然,我建议您仔细想想,为什么您首先不确定字符串的类型。最好将区别分开,而不是编写“弱”API来接受这两种区别。Python3只是鼓励您保持分离。

不存在(s,字节)
总是正确的。您的意思是将
s.decode('utf-8')
分配给第一个代码段中的
s
以外的内容吗?@jwodder的想法是在代码段之间会有其他代码。我只是演示了如果您不知道现有类型,如何将某些内容转换为unicode或字节。