我正在编写一个生成字符串某些部分的函数,并将在另一个字符串中调用,以便完成该句子。
但是,限制是必须在引号中设置此完整字符串。它看起来像:
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脚本输出来控制的,我的函数只是将年份作为字符串返回。
答案 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())