Python:函数与多个函数的关键?

时间:2017-07-13 19:31:55

标签: python function

对此有何普遍共识:

def stock_amend(self, key, quantity):
    if key == "add":
        self.stock_quantity += quantity
    elif key == "remove":
        self.stock_quantity -= quantity
    ...

VS

def stock_add(self, quantity):
    self.stock_quantity += quantity

def stock_remove(self, quantity):
    self.stock_quantity -= quantity

...

这两个中哪一个是定义简单,类似功能的更好方法?使用关键字或只定义多个函数?

5 个答案:

答案 0 :(得分:4)

我最习惯看到它的方式是使用类:

class Stock:
    def add(self, quantity):
        self.stock_quantity += quantity
    def remove(self, quantity):
        self.stock_quantity -= quantity

或者如果逻辑非常相似,你可以只做一个改变方法:

def stock_change(self, delta):
    self.stock_quantity += delta

并将负值传递给它以实现负面更改。

有人认为你要非常小心,但确保你有一个干净的api。作为程序不同部分之间的界限,通常是程序中最难改变的部分。通常,您希望函数只执行一项操作。这称为单一责任原则。在您继续之前,谷歌“如何设计API”并阅读人们对它的看法。其中许多意见都来自于来之不易的经历。

它最终取决于想要什么。你比我更了解你的应用程序。

我不认为自己是专家,但我确实有意见。 Mods,如果这是基于意见/没有帮助,请编辑/删除它。

如果股票是代码中相对不重要的一小部分,我可能会使用stock_change方法(可能将其重命名为描述股票线性变化的东西,所以稍后如果你想要比如说,将股票增加10%,这也是一个“股票交易所”,你的函数名称会更少。我建议这样做的原因是因为代码较少,如果需要,可以稍后将其重构为第二种方法(假设您尚未将其分发给客户)。谷歌“YAGNI”。

如果你用股票做很多事情,最好把它变成自己的类。然后你可以将它子类化,将其他类似的“矮胖”功能分组,等等。谷歌“为什么选择OOP”。

除非你有充分的理由,否则我会避免将字符串用作API的一部分。作为API参数的字符串难以重构 - 它们已经用于用户输入和输出(可能还有其他我现在没有考虑的事情),并且很多程序员都在努力理解哪些字符串是哪些。另外,请记住任何字符串都可以传递给您的api,并且您每次都必须对其进行过滤。他们打字很弱。相反,如果你想使用大多数(全部?)字符串优势的方法,但仍然能够限制传递给你的函数的东西数量,请考虑enums

总之,上述每种方法都有优点和缺点。可能有更多的方法我没有考虑过(我不认为自己是这方面的专家),但你知道你的问题领域最多,这次,即使你弄错了,你也会能够在下次学习它。只需继续阅读,继续重构,你就会知道什么是一个好的API和一个坏的。

答案 1 :(得分:1)

有各种可能的方法,例如将函数发送到实际进行修改的stock_amend,依此类推。

除非我们需要更高的灵活性(由#1提供)在编译时定义事物(#2)是合理的,以便更容易进行静态分析,更简单的代码审查等等。

答案 2 :(得分:0)

我可以使用运算符模块推荐第3种方法吗?

import operator

mapping = {
    'add': operator.add,
    'remove': operator.neg,
}

def stock_amend(self, key, quantity):
    return mapping.get(key)(self.stock_quantity, quantity)

答案 3 :(得分:0)

绕过字符串是一种糟糕的模式。调用者必须记住所有可能的密钥,否则他们必须在源代码中访问其定义。你现在可能还记得这些值,但过了一段时间我们总是会忘记这些事情,任何新的代码工作也会遇到困难。使用单独的定义,大多数编辑提供的自动完成功能将为您完成工作,而在dir()help()中将有所帮助。

除此之外,你可能不得不在这些功能中添加一些条件,只有一个功能会使它更加复杂。

def stock_add(self, quantity):
    assert quantity > 0
    self.stock_quantity += quantity

def stock_remove(self, quantity):
    assert quantity > 0 and self.stock_quantity - quantity >= 0
    self.stock_quantity -= quantity

如果您有多个函数执行几乎相同的操作,则可以使用私有方法编写公共逻辑。

def _update_stock_quantity(self, quantity):
    self.stock_quantity += quantity

def stock_add(self, quantity):
    assert quantity > 0
    self._update_stock_quantity(quantity)

def stock_remove(self, quantity):
    assert quantity > 0 and self.stock_quantity - quantity >= 0
    self._update_stock_quantity(-quantity)

请记住代码的读取次数超过了

答案 4 :(得分:0)

我建议定义多个函数,因为它可以保持代码清晰+简洁,从而实现更强大的代码。每个函数都应该有一个特定的任务,不应该依赖于关键字之类的东西。这样您还可以更轻松地在其他程序中重用您的功能。下面我写了一种方法来访问没有elifclass Stock(): def __init__(self,stock_quantity): self.stock_quantity = stock_quantity def stock_add(self, quantity): self.stock_quantity += quantity def stock_remove(self, quantity): self.stock_quantity -= quantity def update(self,interact,quantity=0): try: getattr(self,interact)(quantity) except AttributeError: pass except TypeError: print(getattr(self,interact)) def main(): stock_obj = Stock(5) stock_obj.update("stock_quantity") stock_obj.update("stock_add",1) stock_obj.update("stock_quantity") if __name__ == "__main__": main() 语句的每个函数,这样你的代码就不会重复了。

Properties > Linker > Input