23

有没有办法用新的格式语法格式化来自函数调用的字符串?例如:

"my request url was {0.get_full_path()}".format(request)

所以它在字符串内部get_full_path调用函数函数,而不是作为格式函数中的参数。

编辑:这是另一个可能会更好地显示我的挫败感的例子,这就是我想要的:

"{0.full_name()} {0.full_last_name()} and my nick name is {0.full_nick_name()}".format(user)

这是我要避免的:

"{0} and {1} and my nick name is {2}".format(user.full_name(), user.full_last_name(), user.full_nick_name())
4

5 回答 5

20

不确定是否可以修改对象,但您可以修改或包装对象以创建函数属性。然后它们看起来像属性,你可以这样做

class WrapperClass(originalRequest):
    @property
    def full_name(self):
        return super(WrapperClass, self).full_name()

"{0.full_name} {0.full_last_name} and my nick name is {0.full_nick_name}".format(user)

这是合法的。

于 2013-11-05T19:20:13.673 回答
14

Python 3.6 添加了文字字符串插值,它是用f前缀编写的。请参阅PEP 0498 - 文字字符串插值

这允许一个人写

>>> x = 'hello'
>>> s = f'{x}'
>>> print(s)
hello

应该注意的是,这些不是实际的字符串,而是代表每次计算为字符串的代码。在上面的例子中,s将是 type str,带有 value 'hello'。您不能传递f-string ,因为它会在str使用之前被评估为结果(不像str.format,但像所有其他字符串文字修饰符,例如r'hello', b'hello', '''hello''')。(PEP 501 -- 通用字符串插值(当前延迟)建议使用字符串文字,该字符串文字将评估为稍后可以进行替换的对象。)

于 2015-12-09T07:31:55.870 回答
8

Python 不直接支持变量插值。这意味着它缺少其他语言支持的某些功能(即字符串中的函数调用)。

所以,除了不,这里没有什么可说的,你不能那样做。这不是 Python 的格式化语法的工作方式。

你拥有的最好的是:

"my request url was {0}".format(request.get_full_path())
于 2013-11-05T18:34:36.730 回答
1

这个非常奇怪的事情怎么办?

"my request url was %s and my post was %s"\
    % (lambda r: (r.get_full_path(), r.POST))(request)

解释:

  1. 经典的格式化方式
  2. 接受请求并返回包含您想要的内容的元组的 Lambda 函数
  3. 调用 lambda inline 作为字符串的参数。

我还是更喜欢你这样做的方式。

如果你想要可读性,你可以这样做:

path, post = request.get_full_path(), request.POST
"my request url was {} and my post was {}".format(path, post)
于 2013-11-05T18:39:19.197 回答
1

所以方法的总结是

(base) [1]~ $ cat r.py
# user is dict:
user = {'full_name': 'dict joe'}
print('{0[full_name]}'.format(user))

# user is obj:
class user:
    @property
    def full_name(self):
        return 'attr joe'


print('{0.full_name}'.format(user()))


# Wrapper for arbitray values - as dict or by attr
class Getter:
    def __init__(self, src):
        self.src = src

    def __getitem__(self, k):
        return getattr(self.src, k, 'not found: %s' % k)

    __getattr__ = __getitem__


print('{0[foo]} - {0.full_name}'.format(Getter(user())))
(base) [1]~ $ python r.py
dict joe
attr joe
not found: foo - attr joe
于 2019-05-15T22:05:27.913 回答