当前位置: 首页 > 面试题库 >

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

陶胤运
2023-03-14
问题内容

假设我有一个自定义类,该类str实现/重写了一些方法:

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

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

ms1 = mystr("my string")

s = "another string"
ms2 = mystr(s)

这还不错,但是它导致了这样的想法,即使用类似于b'bytes string'orr'raw string'或or的自定义字符串前缀会很酷u'unicode string'

是否有可能在Python中创建/注册这样的自定义字符串文字前缀m,以使文字m'my string'产生新的实例mystr
还是将这些前缀硬编码到Python解释器中?


问题答案:

这些前缀在解释器中进行了硬编码,您不能注册更多的前缀。

但是,您 可以 做的是通过使用 自定义源编解码器
预处理Python文件。这是一个相当简洁的技巧,要求您注册一个自定义编解码器,并了解和应用源代码转换。

Python允许您在顶部加上特殊注释来指定源代码的编码:

# coding: utf-8

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

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

然后,您所需要做的就是也构建这样的编解码器,该编解码器将解析Python源文件(对它进行标记,也许使用tokenizemodule标记),并用mystr(<string literal>)调用的自定义前缀替换字符串文字。要解析的任何文件都用标记# coding: yourcustomcodec

我将把这一部分留给读者练习。祝好运!

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



 类似资料:
  • 当我发现可以将用户定义的文字模板化时,我大吃一惊: 但是上面的声明不适用于字符串文字: 给我以下错误: 掠夺。cpp:在函数“int main()”中: prog。cpp:12:15:错误:调用“运算符”“s()”时没有匹配的函数 std::cout prog.cpp:4:34:注意:候选:模板标准::字符串运算符" " _s() 模板标准::字符串运算符" " _s() prog.cpp: 4:

  • 问题内容: 目前,我仅显示键,每个键都在新行中显示: 如何在新行中将它们显示为 key :: value ? 问题答案: 通过迭代器,将生成一个键,值元组: 更新为现代符号:

  • 在我的脚本中,我有一个字符串及其前缀/后缀。我需要从原始字符串中删除前缀/后缀。 例如,假设我有以下值: 如何得到以下结果?

  • 我一直试图使用date.format(DateTimeFormatter formatter)方法格式化一个日期字符串列表,例如,'date'是java.time.LocalDate对象。问题是,我找不到直接从字符串创建Year对象的方法。例如,如果我有字符串yearString=“90”。我想创建一个等于这个值的Year对象,然后使用format方法输出yearStringNew=“1990”。

  • 问题内容: 在数学课上,我们学习了如何定义新的运算符。例如: 这定义了法律。对于x和y的任何实数,x y是x + 2y。 范例:。 可以在JavaScript中定义这样的运算符吗?我知道函数可以胜任: 但我想使用以下语法: 代替这个: 哪个是最接近这个问题的解决方案? 问题答案: 最简洁的答案是不。ECMAScript(标准JS所基于的)不支持运算符重载。 可以使用sweet.js之类的第三方工具

  • 给定示例类: 如何为用户名添加自定义前缀并从id继承值?例如:id的值为1,所以我希望用户名字段的值为:“REGULAR.USER.1”