【问题标题】:Avoiding global variables but also too many function arguments (Python)避免全局变量但也避免过多的函数参数(Python)
【发布时间】:2016-01-06 12:38:31
【问题描述】:

假设我有一个 python 模块,它有很多相互依赖的函数,处理彼此的结果。有很多凝聚力。

这意味着我将来回传递很多参数。要么这样,要么我会使用全局变量。

在这种情况下,处理这种情况的最佳做法是什么?想到的事情是用字典替换这些参数。但我不一定喜欢它如何将函数签名更改为不太具有表现力的东西。或者我可以将所有内容包装到一个类中。但这感觉就像我在作弊并使用“伪”全局变量?

我专门询问如何在 Python 中处理这个问题,但我知道其中许多内容也适用于其他语言。

我没有具体的代码示例,这只是我在考虑这个问题时想到的。

示例可能是:您有一个计算某些东西的函数。在这个过程中,计算了很多辅助的东西。您的处理例程需要访问这些辅助内容,而您不想只是重新计算它。

【问题讨论】:

  • 当你需要传递很多变量时,你的函数不够具体。重新设计你的功能。
  • 如果你真的想要有用的建议,你应该展示一些代码。至少有几个函数的签名。避免问题的正确方法,甚至是试图避免问题的合法性在很大程度上取决于您传递的数据的含义和语义。
  • 后跟Move Method
  • 你想多了。一个类是正确的方法。一个类无论如何都不是“全局的”。实例化类的每个对象都有自己的一组属性,因此它们本质上是对象的本地属性。

标签: python arguments global-variables parameter-passing


【解决方案1】:

正如 RobertB 所说,对象似乎是最清晰的方法。可以这么简单:

class myInfo:
    def __init__(self, x=0.0, y=0.0):
        self.x = x
        self.y = y
        self.dist = self.messWithDist()

    def messWithDist(self):
        self.dist = math.sqrt(self.x*self.x + self.y*self.y)

blob = myInfo(3,4)
blob.messWithDist()
print(blob.dist)
blob.x = 5
blob.y = 7
blob.messWithDist()
print(blob.dist)

如果某些函数实际上不应该是此类对象的一部分,则可以将它们定义为(非成员、独立)函数,并将 blob 作为一个参数传递。例如,通过取消缩进 messWithDist 的 def,然后调用 messWithDist(blob) 而不是 blob.messWithDist()。

-s

【讨论】:

  • 您应该使用__init__-arguments 设置属性。方法应该返回一个值或更改一个属性,而不是两者兼而有之。
  • 真;想到了这一点,但决定保持简短。将编辑。
【解决方案2】:

这是一个非常笼统的问题,因此很难具体说明。您似乎在描述的是一堆共享数据的相互关联的功能。该模式通常被实现为一个对象。

创建一个包含很多方法的类,而不是一堆函数。对于公共数据,使用属性。设置属性,然后调用方法。这些方法可以引用属性,而无需将它们作为参数显式传递。

【讨论】:

    猜你喜欢
    • 2012-12-19
    • 1970-01-01
    • 2011-04-10
    • 2020-10-02
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多