如何在引号内调用python函数

时间:2013-08-21 13:49:27

标签: python python-2.7

我正在编写一个生成字符串某些部分的函数,并将在另一个字符串中调用,以便完成该句子。

但是,限制是必须在引号中设置此完整字符串。它看起来像:

date = 'The date is get_date()'

其中get_date()是一个以字符串形式返回日期的函数(虽然稍微复杂一点)。问题是python不会让我在引号内调用函数。

有什么想法吗?

由于

编辑: 我会更加具体地说明我正在尝试做什么,因为我认为它并不复杂,而且你看起来像是一帮很有帮助。

我有一个定义了一堆变量的配置文件(conf.py)。其中一个我想操作(使用python脚本)是版权年份:

one_of_the_options = [('example1', 'Copyright 2008-CURRENTYEAR Company Name Ltd.')]

CURRENTYEAR是我想通过python脚本输出来控制的,我的函数只是将年份作为字符串返回。

5 个答案:

答案 0 :(得分:5)

请改为尝试:

date = 'The date is {}'.format(get_date())

以上使用格式化字符串,比评估字符串中的代码更简单(更安全) - 并且要评估的实际函数可以作为参数传递,以提高灵活性。例如,对于编辑后的示例:

def get_current_year():
    return '2013' # just an example, not the real function

s = 'Copyright 2008-{} Company Name Ltd.'
s.format(get_current_year())
=> 'Copyright 2008-2013 Company Name Ltd.'

格式化字符串允许您用字符串中的{}占位符替换您想要的任何值,特别是它可以是函数调用。阅读documentation

中有关格式字符串的更多信息

答案 1 :(得分:2)

奥斯卡的解决方案肯定会有效,但根据您的使用情况,还有另一个选项可能会有效。例如,如果您正在使用某个模块中的函数,但是您不确定哪个函数并将其作为字符串获取,则可以以非理想的方式将该字符串强制转换回相关函数,但不能几乎与eval一样糟糕。例如:

import requests

def run_request(method, **kwargs):
    return getattr(requests, method)(**kwargs)

因为函数是python中的对象,所以你实际上可以通过字符串表示来检索它们。如果你能避免,我仍然会同意你不想这样做。

为了回应您的更新,您可能会喜欢其他语法,但它几乎只是Oscar答案的一个简单替代方案。假设您有一个返回所需内容的函数year。你可以这样做:

"Copyright 2008-%s" % your_function()

答案 2 :(得分:1)

如果您的conf文件已经是python脚本,那么您可以直接在其中运行python代码。公然诽谤@ÓscarLópez的答案:

one_of_the_options = [('option1', 'Copyright 2008-{} Company Name Ltd.'.format(current_year()))]

答案 3 :(得分:1)

在我看来,这是使用模板的绝佳机会。

所以你写的是这样的:

one_of_the_options = [('example1', 'Copyright 2008-{{ curent_year }} Company Name Ltd.')]

然后,不是直接输出文本,而是首先使用模板引擎渲染它。

Python Wiki上的Templating页面概述了使用模板。

答案 4 :(得分:1)

或者你可以只使用字符串连接:

  

date ='日期为'+ str(get_date())