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
.
我将把这一部分作为读者的练习.祝好运!
注意,然后将此转换的结果编译为字节码,该字节码被缓存; 您的转换只需要为每个源代码修订运行一次,使用您的编解码器的所有其他模块导入将加载缓存的字节码.
PhM*_*ota 12
可以使用运算符重载来隐式转换str
为自定义类
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 的字符串前缀,我选择了该字符,|
但它也可以是&
或其他二进制比较运算符。
归档时间: |
|
查看次数: |
1246 次 |
最近记录: |