如下所示的代码段(如果某些键不在dict中,我想存储整个dict内容,否则仅存储键的值)
result = {
'stdout': 'some output'
}
print('result: %s' % result['stderr'] if 'stderr' in result else result)
with open('result.txt', 'w') as f:
f.write('result: %s\n' % result['stderr'] if 'stderr' in result else result)
在这里,我尝试使用write
记录一些消息,该消息检查dict stderr
中是否result
,如果是,则使用它(一个字符串),否则记录dict {{ 1}}。
在result
中工作正常,但在print
中失败:
TypeError:write()参数必须为str,而不是dict
因为我使用write
,我希望将字符串或字典自动转换为字符串吗? (即%s
)
为什么它在str(result)
上失败了?
答案 0 :(得分:4)
您的代码中的问题是'%'的优先级高于条件运算符。因此,
'result: %s' % result['stderr'] if 'stderr' in result else result
等同于
('result: %s' % result['stderr']) if 'stderr' in result else result
因此,如果'stderr' not in result
,则此表达式将返回result
,这是一个字典。现在,print()
将打印任何内容,但是write
需要一个字符串参数,并且在接收到字典后会失败。
您想要的结果是:
'result: %s' % (result['stderr'] if 'stderr' in result else result)
您的代码应作如下修改:
print('result: %s' % (result['stderr'] if 'stderr' in result else result))
with open('result.txt', 'w') as f:
f.write('result: %s\n' % (result['stderr'] if 'stderr' in result else result))
答案 1 :(得分:2)
您看到此错误,因为如果'result'不包含'stdout',那么您拥有的Python表达式将导致一个字典对象。可以print
进行编辑-打印愉快地接受任何数据类型,但是写入不接受。
问题在于表达式中运算的优先级:if ... else绑定的绑定程度不如%。
我怀疑您想要的是这个
f.write('result: %s\n' % (result['stderr'] if 'stderr' in result else result) )
注意括号。