【问题标题】:Variable Substitution in PythonPython中的变量替换
【发布时间】:2014-06-27 08:26:26
【问题描述】:

所以我正在使用 Web.py 并且我有以下代码:

check = db.select('querycode', where='id=$id', vars=locals())[0]

效果很好,它将 $id 替换为变量。但是在这一行中它不起作用:

web.sendmail('mail@mail.mail', "tomail@tomail.tomail", 'Subject', 'Hello $name')

我做错了什么以及它如何工作。我的概念是否正确:$ 符号替换了变量?

【问题讨论】:

  • vars=locals() 位很好地表明第一个示例中发生的事情是在 inside db.select 完成的,而不是 Python 在传递字符串之前对其进行转换。在这种情况下,出于安全原因,它是由数据库完成的——它有助于防止SQL Injection——而这个特性实际上不能在Python 级别(安全性取决于为 db 提供比一个长字符串更结构化的东西)。

标签: python string web.py


【解决方案1】:

@merlin2011 的回答最能说明问题。

但只是为了补充它,因为你试图用变量名替换 ,python 还支持以下形式的“替换”(或字符串格式):

'Hello %(name)s' % locals()

或者限制命名空间:

'Hello %(name)s' % {'name': name}

编辑 从 python 3.6 开始,变量替换是使用 f-strings 本地完成的。例如,

print( f'Hello {name}' )

【讨论】:

    【解决方案2】:

    Python 通常不做 PHP 风格的变量插值。

    您在第一条语句中看到的是 db.select 的一个特殊功能,它从调用者上下文中的局部变量中挑选变量值。

    如果您想替换第二行中的变量,则必须使用 Python 提供的一种方法手动完成。这是一种这样的方式。

    web.sendmail('mail@mail.mail', "tomail@tomail.tomail", 'Subject', 'Hello %s' % name)
    

    这是另一种方式。

    web.sendmail('mail@mail.mail', "tomail@tomail.tomail", 'Subject', 'Hello {0}'.format(name))
    

    第一个选项记录在String Formatting operations

    有关第二个选项的更多详细信息,请参阅 str.formatFormat String Syntax 的文档。

    【讨论】:

    • 好的,就像在 C 中一样,我必须为每种类型使用不同的 %xxx 吗?喜欢整数还是字符?
    • @yrk,对于第一种(较旧的)方法是的,但对于第二种(较新的)方法没有。
    • @yrk,我添加了一些文档链接供您仔细阅读这些方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多