在处理更多对象时(但可以选择只处理一个对象),什么被认为是更好的编程实践?
A:内部循环功能
可以使用一个或多个对象调用函数,它在函数内部迭代:
class Object:
def __init__(self, a, b):
self.var_a = a
self.var_b = b
var_a = ""
var_b = ""
def func(obj_list):
if type(obj_list) != list:
obj_list = [obj_list]
for obj in obj_list:
# do whatever with an object
print(obj.var_a, obj.var_b)
obj_list = [Object("a1", "a2"), Object("b1", "b2")]
obj_alone = Object("c1", "c2")
func(obj_list)
func(obj_alone)
B:LOOP OUTSIDE FUNCTION
函数只处理一个对象,当处理更多对象时,必须多次调用。
class Object:
def __init__(self, a, b):
self.var_a = a
self.var_b = b
var_a = ""
var_b = ""
def func(obj):
# do whatever with an object
print(obj.var_a, obj.var_b)
obj_list = [Object("a1", "a2"), Object("b1", "b2")]
obj_alone = Object("c1", "c2")
for obj in obj_list:
func(obj)
func(obj_alone)
我个人更喜欢第一个(A),因为对我来说,它在调用函数时会产生更干净的代码,但也许它不是正确的方法。是否有一些方法通常比另一方更好?如果没有,每种方法的缺点和优点是什么?
答案 0 :(得分:4)
函数应具有已定义的输入和输出,并遵循single responsibility principle。你需要能够根据“我把foo放入,我得到回酒”来清楚地定义你的功能。您需要在此语句中进行的更多限定符才能正确描述您的函数,这可能意味着您的函数执行过多。 “我把foo放进去并取回吧,除非我把baz放进去然后我也会回来,除非我把foo-baz放进去然后它会错误”。
在这种特殊情况下,您可以传递对象或对象列表。尝试将其概括为值或值列表。如果您想将列表作为值传递,该怎么办?现在你的功能行为是模棱两可的。您希望单个列表对象成为您的值,但该函数将其视为多个参数。
因此,在实践中采用一个参数来处理多个值的函数是微不足道的。没有理由通过使其适应多个参数来使函数的设计复杂化。尽可能简单明了地编写函数,如果需要它来处理事物列表,那么可以通过 outside 函数列表循环它。
如果您尝试为函数指定一个实际有用的名称来描述它的作用,这可能会变得更加清晰。您需要使用复数或单数术语吗? foo_the_bar(bar)
除了foo_the_bars(bars)
之外还有其他功能。
答案 1 :(得分:-1)
如果你实施B,那么你将更难以实现A。
如果你实现了A,那么实现B并不是很困难。你也有很多工具可以将这个函数应用到一个参数列表中(你描述的循环方法,使用像map这样的东西,甚至如果需要,可以采用多处理方法)
因此我会选择实现A,如果它在某个特定情况下使事情变得更整洁或更容易,你也可以考虑实现B(使用A),这样你就可以同时使用。