我有一个期望在数字类型上运行的函数。我正在读取要从文件操作的数字,所以当我读它们时,它们是字符串,而不是数字。是否更好地使我的函数能够容忍其他类型(下面的选项(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
答案 0 :(得分:6)
如果你的函数希望对数字数据进行操作,那么你最好允许Python在没有收到错误的情况下抛出TypeError
。我会说,在外面进行转换并处理异常。
def numeric_operation(arg):
# Do numeric things
try:
numeric_operation("abc")
except TypeError:
print("That was supposed to be numeric.")
答案 1 :(得分:5)
我会拆分这些操作。有一个函数可以从文件中读取数字,并让该函数返回实数或数组。执行数字操作的函数不应该在每次调用时处理转换,并且您不必为每个函数实现它。可能存在异常,例如接受数字的数字函数,数字列表和数组等。
当你把所有东西放在一起时,你将看不到任何字符串。你为什么要?您提到的文件中没有真正的字符串。这些是编码为字符串的数字,因此只需相应地读取它们,并在从文件中导入数据的函数中隐藏转换。
答案 2 :(得分:1)
这在很大程度上取决于您的使用案例。您的函数名称表明这是一个严格的数学操作,在这种情况下接受字符串可能没有意义。这基本上是关于separation of concerns的问题;如果你的函数是数学的,它不应该也进行转换。所以在这种情况下,我建议首先进行转换,并仅将数字类型传递给函数。
但是,如果这是一个执行大量I / O的函数,那么在传入的任何内容上调用int
可能是完全合理的 - 甚至更好。如果你的函数在做什么的话对数据进行一些奇怪的转换以使其可以呈现给最终用户,或者转换用户输入,这些转换应该被封装并尽可能地组合在一起,这样他们所做的工作就不会“流血”到其他功能
答案 3 :(得分: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