2

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

但是,限制是这个完整的字符串必须用引号括起来。它看起来像:

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 脚本的输出来控制的,我的函数只是将年份作为字符串返回。

4

5 回答 5

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.'

格式化字符串允许您将字符串中的{}占位符替换为您想要的任何值,特别是,它可以是函数调用。在文档中阅读有关格式字符串的更多信息。

于 2013-08-21T13:53:53.213 回答
2

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

import requests

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

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

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

"Copyright 2008-%s" % your_function()
于 2013-08-21T14:07:20.283 回答
1

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

one_of_the_options = [('option1', 'Copyright 2008-{} Company Name Ltd.'.format(current_year()))]
于 2013-08-21T14:12:18.197 回答
1

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

所以你会写这样的东西:

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

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

Python Wiki 上的模板页面很好地概述了使用模板。

于 2013-08-21T14:28:05.300 回答
1

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

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

于 2013-08-21T14:36:42.417 回答