7

我有一个希望对数字类型进行操作的函数。我正在读取要从文件中操作的数字,所以当我读取它们时它们是字符串,而不是数字。让我的函数能够容忍其他类型(下面的选项(A)),还是在调用函数(下面的选项(B))之前转换为数字更好?

# Option (A)
def numeric_operation(arg):
    i = int(arg)
    # do something numeric with i

# Option (B)
def numeric_operation(arg):
    # expect caller to call numeric_operation(int(arg))
    # do something numeric with arg
4

4 回答 4

6

如果您的函数希望对数字数据进行操作,那么您最好允许 Python 在TypeError 它没有收到并且出现问题时抛出 a。我会说,在外面进行转换并处理异常。

def numeric_operation(arg):
   # Do numeric things

try: 
  numeric_operation("abc")
except TypeError:
  print("That was supposed to be numeric.")
于 2012-04-22T12:37:42.533 回答
5

我会拆分这些操作。有一个函数从文件中读取数字,并让该函数返回实数或数组。执行数字运算的函数不必在每次调用它们时都处理转换,并且您不必为每个函数实现它。可能会有例外,例如接受数字的数字函数、数字列表和数组等。

当您将所有内容放在一起时,您将看不到任何字符串。你为什么要?您提到的文件中没有真正的字符串。这些是编码为字符串的数字,因此只需相应地读取它们并将转换隐藏在从文件中导入数据的函数中。

于 2012-04-22T12:40:23.543 回答
1

这在很大程度上取决于您的用例。您的函数名称表明这是一个严格的数学运算,在这种情况下,接受字符串可能没有意义。这基本上是一个关于关注点分离的问题;如果你的函数做数学,它也不应该转换。所以在这种情况下,我建议先转换,然后只将数字类型传递给函数。

但是,如果这是一个执行大量 I/O 的函数,例如,调用传入的任何内容可能是完全合理的——甚至更可取int的。如果你的函数正在对你的数据进行一些奇怪的转换为了让最终用户可以展示它,或者为了转换用户输入,这些转换应该尽可能地封装和组合在一起,这样他们所做的工作就不会“渗入”其他功能。

于 2012-04-22T12:37:51.473 回答
1

不要做任何事。

Python 已经有一个很好的错误处理机制,如果你试图用一个字符串做一些数字的事情,它会抛出,而你所做的任何事情都只会隐藏你期望得到的错误。

>>> def foo(i):
...     return i+1
...
>>> foo(3)
4
>>> foo("hello")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 2, in foo
TypeError: Can't convert 'int' object to str implicitly
于 2012-04-22T13:03:10.760 回答