我想编写一个包含函数func
的模块。由于技术细节,它需要一个参数tech
。由于tech
与技术详细信息有关,因此tech
具有默认值,很少需要进行任何更改。我想出了两种处理它的方法:
将tech
作为func
的参数,并保留一些默认值。问题是我有许多其他函数调用此函数,例如,gunc
,hunc
...要允许用户更改tech
,所有这些调用函数gunc
,hunc
需要tech
个参数,这是不简洁的。
使tech
成为全局变量并允许用户更改它。这里的问题是func
现在容易受到副作用的影响,这似乎是一个糟糕的设计。
然后我应该如何处理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
个参数,则必须采用无数个其他技术参数,这是不可接受的。
答案 0 :(得分:1)
如果您希望呼叫gunc
和hunc
的用户能够更改tech
,那么您应该将其作为默认参数包含在这些功能中。
虽然默认值可能为“无”,但如果未设置为“无”,gunc
和hunc
会在没有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变量。