假设这个函数有很多变量设置:
def set_variables():
var_a = 10
var_b = 200
和这些变量需要在多个函数中设置,并通过它们的var名访问。有没有一种方法来创建这个函数s.t.之后,它调用父函数,它有var_a
和var_b
,而不必返回它们?上面的函数是一个例子,但实际上有很多变量,所以像下面这样的东西是不可行的。
def parent_function():
var_a, var_b, ... = set_variables()
最好是
def parent_function():
set_variables()
# do some code with var_a or var_b
或者甚至返回key
,val
的字典,并自动生成key
名称设置为val
的变量。
例如
def parent_function():
var_dict = set_variables()
some_func_to_auto_set_vars_from_dict(var_dict)
# Do something with var_a or var_b
返回一个集合,允许您按名称访问值而无需重新分配它们,例如dict:
def set_variables():
return {
'a': 10,
'b': 200,
}
def parent_function():
v = set_variables()
# do some code with v['a'] or v['b']
或者(我个人对这个用例的偏好)一个NamedTuple
,它为您提供了类型检查的好处(和IDE自动完成,就像您使用顶级命名变量一样):
from typing import NamedTuple
class Vars(NamedTuple):
a: int
b: int
def set_variables() -> Vars:
return Vars(a=10, b=200)
def parent_function():
v = set_variables()
# do some code with v.a and v.b
让所有函数设置所有变量似乎很容易。但是这种隐式的状态共享已被证明是维护的噩梦。
应该使用不可变的数据类;它们或多或少地提供了您所要求的便利,但允许更容易地对代码进行推理。
@dataclass
class Settings:
a: str =""
b: int =5
...
def parent():
s = initialize(Settings(c=[1,2,3]))
use(s.a, s.b)
...
def initialize (s: Settings):
return dataclass.replace(s,
b=10, d="@#$_"
)