python数据类型coverion在打印和写入中表现不同

时间:2018-09-07 06:37:11

标签: python

如下所示的代码段(如果某些键不在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)上失败了?

2 个答案:

答案 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) )

注意括号。