【问题标题】:using f-string with C-style string formatting in python在python中使用带有C风格字符串格式的f-string
【发布时间】:2018-08-10 17:49:40
【问题描述】:

我想编写一个函数来构建一个字节类型的字符串,该字符串需要使用具有不同值的 f 字符串。我能想到的唯一方法就是下面的代码。任何人都有更好的 建议?在代码中,我有像 I have level 这样的字符串,但在我的实际代码中,字符串大约是 600 个字符

def get_level_string(x):
    size = dict(v1=1, v2= 200, v3= 30000)
    s = size.get('v1')
    name = lambda x: f"I have level value as {x} in the house"
    return {
            'level1': b'%a' % (name(size['v1'])),
            'level2': b'%a' % (name(size['v2'])),
            'level3': b'%a' % (name(size['v3'])),
            }[x]

a = get_level_string('level1')
b = get_level_string('level2')
c = get_level_string('level3')
print(a, type(a))
print(b, type(b))
print(c, type(c))
=> #b"'I have level value as 1 in the house'" <class 'bytes'>
=> #b"'I have level value as 200 in the house'" <class 'bytes'>
=> #b"'I have level value as 30000 in the house'" <class 'bytes'>

【问题讨论】:

  • 为什么不只是 .encode() 字符串?例如lambda x: f"&lt;blah&gt; ... {x} ...".encode() 然后你只有'level': name(size['v1'])

标签: python-3.x f-string


【解决方案1】:

您可以通过生成字符串然后调用它们的encode 方法来使它们成为bytes 对象,从而使这变得更简单。请注意,您的函数实际上只是构建一个字典,然后在其中查找内容。只构建一次字典然后以不同的名称提供绑定的__getitem__ 方法要简单得多。

template = "I have level value as {} in the house"
size_list = (1, 200, 30000)
sizes = {f"level{i}": template.format(x).encode() for i, x in enumerate(size_list, start=1)}
get_level_string = sizes.__getitem__


# tests
a = get_level_string('level1')
b = get_level_string('level2')
c = get_level_string('level3')
print(a, type(a))
print(b, type(b))
print(c, type(c))

打印

b'I have level value as 1 in the house' <class 'bytes'>
b'I have level value as 200 in the house' <class 'bytes'>
b'I have level value as 30000 in the house' <class 'bytes'>

为您的测试

【讨论】:

  • thx,但我应该提到输出在该序列中不是必需的。更新我的问题
  • @jacobcan118 恐怕我不明白。你的意思是说你代码中的各种leveln其实是不相关的600个字符串?
  • 我的意思是我的输出不一定是level1到level3,它可能是随机顺序的get_level_string('level2')、get_level_string('level3')、get_level_string('level1')
  • @jacobcan118 我仍然没有看到问题。 __getitem__ 不会影响底层字典,所以我不应该关心你调用它们的顺序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多