一个很少需要参数的python函数

时间:2017-03-07 17:06:04

标签: python

我想编写一个包含函数func的模块。由于技术细节,它需要一个参数tech。由于tech与技术详细信息有关,因此tech具有默认值,很少需要进行任何更改。我想出了两种处理它的方法:

  1. tech作为func的参数,并保留一些默认值。问题是我有许多其他函数调用此函数,例如,gunchunc ...要允许用户更改tech,所有这些调用函数gunchunc需要tech个参数,这是不简洁的。

  2. 使tech成为全局变量并允许用户更改它。这里的问题是func现在容易受到副作用的影响,这似乎是一个糟糕的设计。

  3. 然后我应该如何处理tech参数?

    修改

    提供更多信息,正如评论所指出的,这是一个例子:

    def func(room, tech):
        """
        calculate how many lights we need to illuminate a room
        param tech: True if the owner wants the room to be more bright, so
        add some lights. This is seldom used since most people are 
        satisfied.
        """
        # do calculation
        return result
    
    def gunc(room):
        """
        calculate how much money it takes to light a room.
        """
        return result
    
    # here's many other functions
    
    def hunc(company)
        """
        calculate how much money it takes to run a company
        """
        for room in company.rooms:
            money += gunc(room)
        money += many many other costs
        return money
    

    在此示例中,在tech中包含hunc参数没有意义。毕竟,运营公司究竟与房间所有者想要多少灯有关?此外,如果hunc需要tech个参数,则必须采用无数个其他技术参数,这是不可接受的。

3 个答案:

答案 0 :(得分:1)

如果您希望呼叫gunchunc的用户能够更改tech,那么您应该将其作为默认参数包含在这些功能中。

虽然默认值可能为“无”,但如果未设置为“无”,gunchunc会在没有func参数的情况下调用tech

这样,您只需在tech中定义一次func的默认值,但您可以避免使用全局变量。

示例:

def func(tech=42):
    print(tech)


def gunc(my_param, tech=None):

    if tech:
        func(tech)
    else:
        func()


# call hunc with default tech
gunc('Hello')

# specify tech
gunc('Hello', tech=7)

答案 1 :(得分:1)

我认为你想要跟踪状态,但我会避免使用全局变量。相反,我会将技术参数封装在一个类中。

class Room:
    def __init__(self, bright=False):
        self.bright = bright

    @property
    def lights(self):
        if self.bright:
            return 42
        return 21

    @property
    def lighting_cost(self):
        return self.lights * 10


class Building:
    def __init__(self, rooms):
        self.rooms = rooms

    @property
    def total_lighting_cost(self):
        return sum(room.lighting_cost for room in self.rooms)


room_a = Room()
room_b = Room(bright=True)
building = Building([room_a, room_b])

print building.total_lighting_cost # 630 = 210 + 420

这使用属性,但可以使用适当命名的方法轻松替换它们。

答案 2 :(得分:0)

简单:

default_value = 10 #an example,can be anything
called_tech_value = 9 #you decide
def func(tech = default_value,tech_for_calls = called_tech_value):
    pass

您需要做的就是在其他功能中使用tech_for_calls变量。