有没有办法用新格式语法格式化函数调用的字符串?例如:
"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())
答案 0 :(得分:18)
不确定是否可以修改对象,但可以修改或包装对象以生成函数属性。然后它们看起来像属性,你可以这样做
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)
这是合法的。
答案 1 :(得分:11)
Python 3.6添加了文字字符串插值,使用f
前缀编写。请参阅PEP 0498 -- Literal String Interpolation。
这允许你写一个
>>> x = 'hello'
>>> s = f'{x}'
>>> print(s)
hello
应该注意的是,这些不是实际的字符串,而是表示每次都计算为字符串的代码。在上面的示例中,s
的类型为str
,值为'hello'
。您无法传递f
- 字符串,因为在使用之前它将被评估为结果str
(与str.format
不同,但与其他所有字符串文字修饰符一样,例如{ {1}},r'hello'
,b'hello'
)。 (PEP 501 -- General purpose string interpolation(当前是延迟的)建议一个字符串文字,它将评估一个可以在以后进行替换的对象。)
答案 2 :(得分:6)
Python不直接支持变量插值。这意味着它缺少其他语言支持的某些功能(即,字符串中的函数调用)。
所以,除了不,没有什么可说的,你不能这样做。这不是Python formatting syntax的工作方式。
你拥有的最好的是:
"my request url was {0}".format(request.get_full_path())
答案 3 :(得分:1)
这个非常奇怪的事情呢?
"my request url was %s and my post was %s"\
% (lambda r: (r.get_full_path(), r.POST))(request)
说明:
我仍然喜欢你这样做的方式。
如果您想要可读性,可以这样做:
path, post = request.get_full_path(), request.POST
"my request url was {} and my post was {}".format(path, post)
答案 4 :(得分:0)
所以方法摘要将是
(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