1

我们的项目变得有点大,前几天我遇到了这个问题,当我试图向一个函数添加一个简单的错误消息时:

def create_report(id):
    report = new_report(id)
    if not report:
        raise api_error('Could not find report with id %d' % (id,))
    ...

问题? id是一个字符串,当它试图将其格式化为数字时它崩溃了。我不是该函数的原始作者,并错误地认为那id将是一个数字。相反,它应该是一个字符串。哎呀。

如果这是一种强类型语言,我会立即从编译器中得到一个错误;处理这类事情的最佳方法是什么?我应该检查每个参数的类型(看起来像很多跑腿),还是应该把所有东西都放在try:块中?也许我们应该在每个函数中写一个注释来描述它的参数?或者我只是应该知道更好?

4

6 回答 6

2

该格式字符串应该使用%s,不是因为id它是一个字符串,而是因为它通常是最佳选择。%d需要数字类型,但%s如有必要,会将其他类型转换为字符串。%d只有在需要更改数字格式时才应使用。

于 2012-09-08T16:02:11.910 回答
0

如果你真的想确保字符串打印函数不会崩溃,你可能最好使用 %s,它使用 pythons str() 函数将积分值转换为字符串。看看你在说什么是一个 ID,我假设它是 int 类型的——在这种情况下,这个解决方案应该可以正常工作(如果你使用浮点数,我不太确定 str() 有多少位数将继续)。

编辑 哦,男孩,我很慢......

于 2012-09-08T16:08:10.980 回答
0

甚至比其他答案更好,如果消息是针对开发人员的眼睛%s,我发现最好使用。%r这将帮助您区分微妙的情况。例如,如果您'12 '使用 id 调用此函数,则 %s 消息将不会显示尾随空格。 %r使用值的 repr(),因此将包含引号,帮助您查看精确值。

于 2012-09-08T16:18:37.690 回答
0

我认为这里的问题是您在发生意外情况时应该执行的代码部分中的值断言。如果出现问题,也许更好的方法是更改new_report(id)​​以引发异常 - 指定它是值错误还是找不到 id。那么你的代码应该是:

def create_report(id):
    report = new_report(id)

...

def new_report(id):
    try:
       # find the report by id
       # if couldn't find raise api_error
    except ValueError:
       # explain that id is the wrong type
于 2012-09-08T17:42:31.410 回答
0

使此类事情在参数类型方面更加健壮的一种可能策略是编写:

def create_report(id):
    report = new_report(id)
    if not report:
        raise api_error('Could not find report with id %s' % (id,))
    ...

它并不总是看起来不错,但至少它不会轻易损坏。

但一般来说,为函数制定一些明确的合同总是更好的。文档字符串是正确的地方。

于 2012-09-08T16:02:21.903 回答
0

尝试使用 %s,然后使用 str(variable)。这将确保所有内容都转换为字符串(甚至列表和元组)并且不会发生 TypeError

def create_report(id):
    report = new_report(id)
    if not report:
        raise api_error('Could not find report with id %s' % (str(id),))
    ...
于 2012-09-08T16:12:39.137 回答