可以在Python中创建自定义字符串文字前缀?

Byt*_*der 6 python string prefix string-literals

假设我有一个自定义类派生自str实现/覆盖一些方法:

class mystr(str):
    # just an example for a custom method:
    def something(self):
        return "anything"
Run Code Online (Sandbox Code Playgroud)

现在我必须mystr通过在构造函数中传递一个字符串来手动创建实例:

ms1 = mystr("my string")

s = "another string"
ms2 = mystr(s)
Run Code Online (Sandbox Code Playgroud)

这并不是太糟糕,但它导致了使用类似于b'bytes string'r'raw string'或的自定义字符串前缀会很酷的想法u'unicode string'.

在Python中以某种方式可以创建/注册这样的自定义字符串文字前缀,m以便文字m'my string'导致新的实例mystr
或者这些前缀是否硬编码到Python解释器中?

Mar*_*ers 14

这些前缀在解释器中是硬编码的,您不能注册更多的前缀.


但是,您可以使用自定义源编解码器预处理Python文件.这是一个相当简洁的黑客,需要您注册自定义编解码器,并理解和应用源代码转换.

Python允许您在顶部使用特殊注释指定源代码的编码:

# coding: utf-8
Run Code Online (Sandbox Code Playgroud)

告诉Python使用UTF-8编码的源代码,并在解析之前相应地解码文件.Python在codecs模块注册表中查找编解码器.而且你可以注册自己的编解码器.

pyxl项目使用这种伎俩来解析出从Python文件的HTML语法与实际的Python语法来替换它们构建HTML,尽在"解码"的一步.查看该项目中的codec,其中register模块注册自定义codec搜索功能,该功能在Python实际解析和编译之前转换源代码.在您的目录中安装了一个自定义.pth文件,site-packages以便在Python启动时加载此注册步骤.另一个用于解析Ruby样式字符串格式的项目是interpy.

所有你需要做的就是构建这样一个编解码器,它将解析一个Python源文件(用它标记它,可能是tokenize模块)并用mystr(<string literal>)调用的自定义前缀替换字符串文字.您想要解析的任何文件都标记为# coding: yourcustomcodec.

我将把这一部分作为读者的练习.祝好运!

注意,然后将此转换的结果编译为字节码,该字节码被缓存; 您的转换只需要为每个源代码修订运行一次,使用您的编解码器的所有其他模块导入将加载缓存的字节码.

  • 哇,我不确定这是一个好主意 - 但黑客因素很棒 (2认同)

PhM*_*ota 12

可以使用运算符重载来隐式转换str为自定义类

\n
class MyString(str):\n    def __or__( self, a ):\n        return MyString(self + a)\n\nm = MyString('')\nprint( m, type(m) )\n#('', <class 'MyString'>)\nprint m|'a', type(m|'a')\n#('a', <class 'MyString'>)\n
Run Code Online (Sandbox Code Playgroud)\n

这避免了使用括号有效地模拟带有一个额外字符 \xe2\x94\x80 的字符串前缀,我选择了该字符,|但它也可以是&或其他二进制比较运算符。

\n