Go 中 Python string.format 的等价物?

2023-12-21

在Python中,你可以这样做:

"File {file} had error {error}".format(file=myfile, error=err)

or this:

"File %(file)s had error %(error)s" % {"file": myfile, "error": err}

在 Go 中,最简单的选项是:

fmt.Sprintf("File %s had error %s", myfile, err)

它不允许您交换格式字符串中参数的顺序,而您需要这样做I18N http://en.wikipedia.org/wiki/Internationalization_and_localization. Go doestemplate包,这需要类似的东西:

package main

import (
    "bytes"
    "text/template"
    "os"
)

func main() {
    type Params struct {
        File string
        Error string
    }

    var msg bytes.Buffer

    params := &Params{
        File: "abc",
        Error: "def",
    }

    tmpl, _ := template.New("errmsg").Parse("File {{.File}} has error {{.Error}}")
    tmpl.Execute(&msg, params)
    msg.WriteTo(os.Stdout)
}

对于错误消息来说,这似乎还有很长的路要走。是否有更合理的选项允许我提供独立于顺序的字符串参数?


With strings.Replacer

Using strings.Replacer https://golang.org/pkg/strings/#Replacer,实现您想要的格式化程序非常简单且紧凑。

func main() {
    file, err := "/data/test.txt", "file not found"

    log("File {file} had error {error}", "{file}", file, "{error}", err)
}

func log(format string, args ...string) {
    r := strings.NewReplacer(args...)
    fmt.Println(r.Replace(format))
}

输出(尝试一下去游乐场 https://play.golang.org/p/sDVi-3NUiw):

File /data/test.txt had error file not found

我们可以通过在参数名称中自动添加括号来使其使用起来更加愉快log()功能:

func main() {
    file, err := "/data/test.txt", "file not found"

    log2("File {file} had error {error}", "file", file, "error", err)
}

func log2(format string, args ...string) {
    for i, v := range args {
        if i%2 == 0 {
            args[i] = "{" + v + "}"
        }
    }
    r := strings.NewReplacer(args...)
    fmt.Println(r.Replace(format))
}

输出(尝试一下去游乐场 https://play.golang.org/p/3Odo_LmM6c):

File /data/test.txt had error file not found

是的,你可以说这只接受string参数值。这是真实的。如果再多一点改进,情况就不会是这样了:

func main() {
    file, err := "/data/test.txt", 666

    log3("File {file} had error {error}", "file", file, "error", err)
}

func log3(format string, args ...interface{}) {
    args2 := make([]string, len(args))
    for i, v := range args {
        if i%2 == 0 {
            args2[i] = fmt.Sprintf("{%v}", v)
        } else {
            args2[i] = fmt.Sprint(v)
        }
    }
    r := strings.NewReplacer(args2...)
    fmt.Println(r.Replace(format))
}

输出(尝试一下去游乐场 https://play.golang.org/p/0KtRjDIFTN):

File /data/test.txt had error 666

其变体接受 params 作为map[string]interface{}并将结果返回为string:

type P map[string]interface{}

func main() {
    file, err := "/data/test.txt", 666

    s := log33("File {file} had error {error}", P{"file": file, "error": err})
    fmt.Println(s)
}

func log33(format string, p P) string {
    args, i := make([]string, len(p)*2), 0
    for k, v := range p {
        args[i] = "{" + k + "}"
        args[i+1] = fmt.Sprint(v)
        i += 2
    }
    return strings.NewReplacer(args...).Replace(format)
}

尝试一下去游乐场 https://play.golang.org/p/i9XUTN9V3m.

With text/template

您的模板解决方案或提案也太冗长了。它可以写得像这样紧凑(省略错误检查):

type P map[string]interface{}

func main() {
    file, err := "/data/test.txt", 666

    log4("File {{.file}} has error {{.error}}", P{"file": file, "error": err})
}

func log4(format string, p P) {
    t := template.Must(template.New("").Parse(format))
    t.Execute(os.Stdout, p)
}

输出(尝试一下去游乐场 https://play.golang.org/p/D-hoAeCakq):

File /data/test.txt has error 666

如果您想退回string(而不是将其打印到标准输出),您可以这样做(在去游乐场 https://play.golang.org/p/L9L9OerQYZ):

func log5(format string, p P) string {
    b := &bytes.Buffer{}
    template.Must(template.New("").Parse(format)).Execute(b, p)
    return b.String()
}

使用显式参数索引

这已经在另一个答案中提到过,但要完成它,请知道相同的显式参数索引可以使用任意次数,从而导致相同的参数被多次替换。在这个问题中阅读更多相关信息:将 Sprintf 中的所有变量替换为相同的变量 https://stackoverflow.com/questions/37001449/replace-all-variables-in-sprintf-with-same-variable

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go 中 Python string.format 的等价物? 的相关文章

  • 导入错误:无法导入名称“FFProbe”

    我无法获取ffprobe包 https github com simonh10 ffprobe在 Python 3 6 中工作 我使用 pip 安装它 但是当我输入import ffprobe it says Traceback most
  • 从 torch.autograd.gradcheck 导入 zero_gradients

    我想复制代码here https github com LTS4 DeepFool blob master Python deepfool py 并且我在 Google Colab 中运行时收到以下错误 ImportError 无法导入名称
  • App Engine 上的 Django 与 webapp2 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 C# 中替换文本,同时保持大小写不变

    我有一组句子需要用来进行替换 例如 abc gt cde ab df gt de 我有一个文本可以在哪里进行更改 但是我无法事先知道所述文本的大小写 因此 举例来说 如果我有 A bgt abc hyi Abc Ab df h 我必须更换并
  • 从内存地址创建python对象(使用gi.repository)

    有时我需要调用仅存在于 C 中的 gtk gobject 函数 但返回一个具有 python 包装器的对象 之前我使用过基于 ctypes 的解决方案 效果很好 现在我从 PyGtk import gtk 切换到 GObject intro
  • DynamodB:如何更新排序键?

    该表有两个键 filename 分区键 和eventTime 排序键 我要更新eventTime对于某些filename Tried put item and update item 发送相同的filename与新的eventTime但这些
  • benchmem 的输出

    使用内存分析器运行基准测试时 我看到以下输出 SomeFunc 100 17768876 ns op 111 B op 0 allocs op 我不明白输出 0 allocs op 但分配了 111 B 知道这意味着什么吗 我的函数是否在堆
  • 如何通过 python 中的函数运行列表?

    我试图通过我创建的函数运行我的列表 但不断收到错误 我不知道出了什么问题 温度 F temp f 19 21 21 21 23 功能 def fahrToCelsius tempFahrenheit return tempFahrenhei
  • Python3将模块从文件夹导入到另一个文件夹

    我的结构字典是 mainFolder folder1 init py file1 py file2 py folder2 init py file3 py file4 py setup py init py 我需要将 file4 py 从f
  • Python Selenium 打印另存为 PDF 等待文件名输入

    我正在尝试通过打印对话框将网站另存为 PDF 我的代码允许我另存为pdf 但要求我输入文件名 我不知道如何将文件名传递到弹出框 附上我的代码 import time from selenium import webdriver import
  • 使用 Pandas 从 csv 文件读取标题信息

    我有一个包含 14 行标题的数据文件 在标头中 有经纬度坐标和时间的元数据 我目前正在使用 pandas read csv filename delimiter header 14 读取文件 但这只是获取数据 我似乎无法获取元数据 有人知道
  • 如何用函数记录一个文件?

    我有一个带有函数 lib py 但没有类的python 文件 每个函数都有以下样式 def fnc1 a b c This fonction does something param a lalala type a str param b
  • Python speedtest.net,或等效的[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 是否有一个 Python 库可以实现 SpeedTest net 测试或等效的互联网连接速度测试 GitHub上有一个项目叫速度检查 https gi
  • 会话数据库表清理

    该表是否需要清除或者由 Django 自动处理 Django 不提供自动清除功能 然而 有一个方便的命令可以帮助您手动完成此操作 Django 文档 清除会话存储 https docs djangoproject com en dev to
  • Eclipse/PyDev 中未使用导入警告,尽管已使用

    我正在我的文件中导入一个绘图包 如下所示 import matplotlib pyplot as plt 稍后我会在我的代码中成功使用此导入 fig plt figure figsize 16 10 然而 Eclipse 告诉我 未使用的导
  • 如何通过selenium中弹出的身份验证?

    我正在尝试使用带有 Selenium 的 Python 脚本加载需要身份验证的网页 options webdriver ChromeOptions prefs download default directory r download de
  • Python脚本从字母和两个字母组合生成单词

    我正在编写一个简短的脚本 它允许我使用我设置的参数生成所有可能的字母组合 例如 b a 参数 单词 5 个字母 第三 第五个字母 b a 第一个字母 ph sd nn mm 或 gh 第二 第四个字母 任意元音 aeiouy 和 rc 换句
  • 如何从邻接表高效创建稀疏邻接矩阵?

    我正在与last fm http labrosa ee columbia edu millionsong lastfm数据集来自百万歌曲数据集 http labrosa ee columbia edu millionsong 数据以一组 j
  • 用 pandas DataFrame 替换 mysql 数据库表中的行

    Python 版本 2 7 6 熊猫版本 0 17 1 MySQLdb 版本 1 2 5 在我的数据库中 PRODUCT 我有一张桌子 XML FEED 表 XML FEED 很大 数百万条记录 我有一个 pandas DataFrame
  • SQLAlchemy 与 count、group_by 和 order_by 使用 ORM

    我有几个函数需要使用 count group by 和 order by 进行一对多连接 我使用 sqlalchemy select 函数生成一个查询 该查询将返回一组 id 然后我对其进行迭代以对各个记录执行 ORM 选择 我想知道是否有

随机推荐

  • 调整包含圆圈的图像映射的大小

    我正在尝试绘制下图中的所有数字 我已经完成了 但现在我想根据窗口的宽度动态调整图像和地图的大小 这是相关的html
  • 无法确定搁置数据库类型,whichdb 无法识别 gdb

    如果我尝试打开刚刚由 shelve 创建的文件 为什么 shelve 会引发错误 import shelve info file name Users bacon myproject temp test info info file she
  • 在结构中启动数组时遇到问题

    class CRA Account int tax 4 double refund 4 int SIN public CRA Account CRA Account CRA Account SIN 0 tax 4 0 refund 4 0
  • ASP.NET Core - System.Text.Json:如何拒绝有效负载中的未知属性?

    ASP NET Core 7 中的 Web API 与 System Text Json 我需要拒绝 PUT POST API 上的 JSON 有效负载 这些 API 指定了其他属性 这些属性不映射到模型中的任何属性 所以如果我的模型是 p
  • Angular UI Router - 使用 ui-sref 导航到动态状态时会出现双斜杠

    我正在创建一个 CMS 系统 因此我希望动态创建状态 由于您无法在配置阶段发出 http 请求 因此我决定在 run 函数中添加路由 如下所述 http blog brunscopelliti com how to defer route
  • 按列值过滤数据帧的行[重复]

    这个问题在这里已经有答案了 我有一个包含 10 列的数据框 一栏给出了鸟类的名称 实际上有 300 个物种 但我只对其中 200 个感兴趣 我只想保留这 200 个物种的信息 我的桌子截图 https i stack imgur com O
  • Hibernate中不同的保存方式有什么区别?

    Hibernate 有一些方法可以以某种方式获取您的对象并将其放入数据库中 它们之间有什么区别 何时使用哪个 为什么没有一种智能方法知道何时使用什么 到目前为止我已经确定的方法是 save update saveOrUpdate saveO
  • 转置一维 NumPy 数组

    我使用 Python 和 NumPy 并且在 转置 方面遇到一些问题 import numpy as np a np array 5 4 print a print a T 调用a T没有转置数组 如果a例如 然后它会正确转置 但我需要转置
  • 如何使用 scalaz.WriterT 记录 for 表达式?

    如何使用 scalaz WriterT 进行日志记录 关于 Monad 变压器 这是一个非常简短的介绍 您可能会找到更多信息哈斯克尔维基 http www haskell org haskellwiki Monad Transformers
  • 如何获取带有浅蓝色字段的 iPhone 地图应用程序蓝点当前位置?

    我认为标题是不言自明的 目前 当我为当前位置添加默认注释时 let currentAnnot MKPointAnnotation currentAnnot coordinate loc coordinate mainMap addAnnot
  • Eclipse kepler - 禁用 javascript 验证

    我刚刚安装了新的 eclipse kepler eclipse 4 3 它向我显示了来自第三方 javascript 库的数百个错误和警告 我尝试通过取消选中 首选项 JavaScript 验证器 中的 启用 JavaScript 语义验证
  • ptrdiff_t 太小?

    我一直想知道 不是吗ptrdiff t应该能够保存任意两个指针的差异根据定义 为什么当两个指针距离太远时会失败 我不是指任何特定的语言 我指的是具有这种类型的所有语言 例如 用地址减去指针1从带有地址的字节指针0xFFFFFFFF当你有 3
  • 在 AWS AMI Linux 服务器上设置 Supervisord [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在努力让主管工作以确保我的队列系统始终运行 以下是我从各种来源拼凑而成的步骤 以 root 或超级用户身份运行 1 easy inst
  • Postgres 时间戳

    我们正在争论在 postgres 中存储时间戳的最佳方式 目前 所有时间戳都存储为 00 并且我们有一个与每个客户端关联的时区 我们查找时区并转换发生某事的时间 这增加了复杂性 因为我们需要进行更多的连接和更复杂的查询 另一种方法是连接到
  • php解析汇率提要XML

    我正在尝试使用欧洲中央银行 ECB 的货币汇率源http www ecb int stats eurofxref eurofxref daily xml http www ecb int stats eurofxref eurofxref
  • BinaryWriter.Write() 如何写入字符串

    我使用BinaryWriter Write 来写入字符串 在msdn中 描述如下 将带有长度前缀的字符串写入 当前编码中的该流 BinaryWriter 并推进 流的当前位置 根据所使用的编码和 正在写入的特定字符 到溪流 我认为长度前缀是
  • 行索引从 1 而不是从零开始,无需在 pandas 中创建附加列[重复]

    这个问题在这里已经有答案了 我知道我可以像这样重置索引 df reset index inplace True 但这将从以下位置开始索引0 我想从1 如何在不创建任何额外列并保留 index reset index 功能和选项的情况下做到这
  • RecyclerView 未在底部调用 onScrolled

    我正在尝试创建一个RecyclerView使用分页 当我尝试向下滚动已经在列表的最后时 我在显示进度条时遇到问题 有回调RecyclerView OnScrollListener其中有一个方法onScrolled用于处理滚动事件 但当没有实
  • 如何处理 webdriver 中的自动完成列表?

    如何从自动完成下拉列表中选择国家 地区名称 请提供谷歌搜索代码的建议 以便我能够理解 如果您的下拉菜单是可编辑的 您可以使用发送键直接键入值 否则您需要根据需要模拟向下箭头键操作 但这一次并不明智 因为如果在下拉列表中添加新值 无论如何在这
  • Go 中 Python string.format 的等价物?

    在Python中 你可以这样做 File file had error error format file myfile error err or this File file s had error error s file myfile