【问题标题】:Best practice for string substitution with gettext using Python使用 Python 使用 gettext 进行字符串替换的最佳实践
【发布时间】:2010-05-24 23:38:53
【问题描述】:

寻找有关使用 gettext() 时使用哪种字符串替换技术的最佳实践建议。还是所有技术都同样适用?

我能想到至少 3 种字符串技巧:

1) 基于经典“%”的格式:

"我的名字是 %(name)s" % locals()

2) 基于 .format() 的格式:

"我的名字是 {name}".format(locals())

3) string.Template.safe_substitute()

导入字符串 template = string.Template("我的名字是 ${name}") template.safe_substitute(locals())

string.Template 技术的优势在于,带有拼写错误的变量引用的翻译字符串仍然可以产生可用的字符串值,而其他技术无条件地引发异常。 string.Template 技术的缺点似乎是无法自定义变量的格式(填充、对齐、宽度等)。

【问题讨论】:

    标签: python string gettext string-formatting


    【解决方案1】:

    实际上,我更愿意在我的测试过程中得到一个异常,尽快修复错误——“错误不应该默默地传递”。所以我认为方法 (2) 是现代 Python 中最好的方法(它支持可读且灵活的format),如果您坚持支持较旧的 Python 版本(其中@ 987654322@ 是进行灵活格式化的“最佳”方式——查找或编码,format 的一些反向移植将是主要的替代方案。

    【讨论】:

    • 亚历克斯:感谢您的回答。我们有一小段代码使用用户可自定义的字符串作为伪模板工具,因此我对 string.Template 技术很感兴趣。我们将硬着头皮使用真正的模板模块来完成这项任务。
    【解决方案2】:

    不要有拼写错误的变量名——这就是测试的目的。

    从表面上看,显示 something 似乎比抛出异常要好,但这些误译迟早会引起某些用户的反感。

    .format() 是这些天要走的路。

    重新考虑将locals() 直接传递给翻译。如果有人想办法在其中一个翻译中使用self 偷偷摸摸地做某事,这将使您不必担心会发生什么。

    【讨论】:

    • Gnibbler:感谢关于 locals() 的提醒。最初我使用 locals() 作为一种快速而肮脏的方式来解释我的问题。但是,您的评论使我回过头来进行快速代码审查,以确保这种编码实践没有渗透到我们的代码中。令我惊讶的是,有几个地方我们实际使用了这种技术。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多