pylint bad-format-string的说明

时间:2014-07-31 11:11:07

标签: python pylint

在以下文件中:

"""hello I am the module spam.py"""
from __future__ import unicode_literals
'hello {world}'.format(world='potato')

bad-format-string我们有以下pylint违规行为:

wim@SDFA100461C:/tmp$ pylint --reports=n spam.py
No config file found, using default configuration
************* Module spam
W:  3, 0: Invalid format string (bad-format-string)

我不明白这个建议,pylint devs说检查是关于PEP 3101样式的,但我没有在PEP中看到任何违反此处的内容。

有什么问题? pylint希望我们做些什么呢?

以下版本号。

wim@SDFA100461C:/tmp$ pylint --version
No config file found, using default configuration
pylint 1.3.0, 
astroid 1.2.0, common 0.62.1
Python 2.7.6 (default, Mar 22 2014, 22:59:56) 
[GCC 4.8.2]

1 个答案:

答案 0 :(得分:3)

这是pylint中的错误;它假定所有字符串格式都是字节字符串

linter解析格式,然后解析占位符名称。因为您使用的是Unicode文字,所以这也会产生unicode名称,但解析器会假设它只会遇到字节串;如果没有,它假设它找到了一个整数:

if not isinstance(keyname, str):
    # In Python 2 it will return long which will lead
    # to different output between 2 and 3
    keyname = int(keyname)

这会为您的格式字符串引发ValueError,因为world会被解析为unicode值:

>>> import string
>>> formatter = string.Formatter()
>>> parseiterator = formatter.parse(u'hello {world}')
>>> result = next(parseiterator)
>>> result
(u'hello ', u'world', u'', None)
>>> keyname, fielditerator = result[1]._formatter_field_name_split()
>>> keyname
u'world'

然后会捕获ValueError异常并将其转换为IncompleteFormatString异常,然后会导致W1302错误代码。

请参阅parse_format_method_string function

应该改变测试以测试与format_string相同的类型:

if not isinstance(keyname, type(format_string)):
    # In Python 2 it will return long which will lead
    # to different output between 2 and 3
    keyname = int(keyname)

这在Python 2和3中都是正确的。