此代码块用于显示列表中的随机字符串。我所做的列表是基于对话何时适合使用的类别。例如,有一个问候列表,一个用于告别,如下所示:一个用于何时不理解输入。在这些列表中,一些字符串使用字符的名称(这是一个变量),而其中一些不使用。为了将播放器的名称赋予使用它的字符串,需要使用字符串格式,但是当随机选择的字符串不使用字符串格式时,我会收到以下错误: TypeError:在字符串格式化过程中并非所有参数都被转换
我怎么能避免这个错误?我想到了异常处理的使用,但据我所知,由于必须符合打印标准,因此无法正常工作,
在“功能”模块中:
print(random.choice(strings.notUnderstand) % username)
在“字符串”模块中:
notUnderstand = [
"""Pardon?
""",
"""I\'m sorry %s, can you repeat that?
""",
"""I don\'t understand what you mean by that.
"""
]
答案 0 :(得分:1)
您可以使用格式,使其更清洁:
not_understand = [
"""Pardon?
""",
"""I\'m sorry {name}, can you repeat that?
""",
"""I don\'t understand what you mean by that.
"""
]
print(random.choice(not_understand).format(name='abc'))
答案 1 :(得分:0)
这是一种方法:
notUnderstand = [
"""Pardon?
""",
"""I\'m sorry %(username)s, can you repeat that?
""",
"""I don\'t understand what you mean by that.
"""
]
print(random.choice(notUnderstand) % {'username': username})
答案 2 :(得分:0)
您可以使用format
import random
notUnderstand = [
"""Pardon?
""",
"""I\'m sorry {}, can you repeat that?
""",
"""I don\'t understand what you mean by that.
"""
]
username='sundar'
print random.choice(notUnderstand).format(username)
答案 3 :(得分:0)
我不认为人们真正了解你的问题;这是 - 如何检测字符串有变量替换,以确保传入正确数量的参数。
你的问题基本上归结为此。你有一个包含两个字符串的列表,一个有一个变量替换:
s = ['Hello {}', 'Thank You']
随机地,需要打印其中一个字符串。如果它有一个变量并且你没有传入它,它将无法正确打印(它会引发TypeError
)
>>> print('hello %s' % (1,))
hello 1
>>> print('hello' % (1,))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: not all arguments converted during string formatting
您可以使用.format()
部分解决此问题,因为当没有替代占位符时,它会无声地失败:
>>> print('hello'.format(name=1))
hello
但是,如果您的字符串确实有占位符,则必须传递足够的变量来替换所有占位符,否则您将获得IndexError
:
>>> print('hello {name} {}'.format(name=1))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: tuple index out of range
要解决此问题,您必须跟踪每个字符串中有多少变量,以确保传递正确数量的参数。通过在列表中存储一个元组来实现这一点,该元组具有字符串所需的数字(以及可选的 kind 变量):
s = [('Hello {name}',('name',)), ('{name} is {foo}', ('name','foo',))]
接下来,创建一个替换字典:
subs = {'name': lambda: 'hello', 'foo': lambda: '42'}
我在这里使用lambdas,因为实际上你需要调用一些函数来获取变量的值。
现在,当你想要构建你的字符串时:
random_string, vars = ('Hello {name}', ('name',))
print(random_string.format(**{k:subs.get(k)() for k in vars}))