python 使用全局变量_python – 使用全局变量作为默认值

我有一个函数,它需要很多参数,因为我不想记住它们的位置,所以我决定使用命名参数

def f(a=None, b=None, c=None):

print a,b,c

f('test', c=5, b='second param')

>>> test second param 5

现在,通常我一次只更改一个参数,所以我想只通过键入来调用该函数

f(c = 3.14),其预期结果为f(a = a,b = b,c = 3.14),即应从本地范围读取未明确传递的每个参数.

但是当然它不起作用,因为使用命名参数我必须设置一个默认值,如果我使用** kwargs,它只是忽略参数

def f(**kwargs):

print a,b,c

a=1; b=2; c=3

f(a=2, b=4, c=8)

>>> 1 2 3 # instead of 2 4 8

我曾经为每个参数定义一个新函数,但我不喜欢这种方法,尽管到目前为止它是最有效的

def fc(c_new):

return f(a, b, c_new)

如何使函数使用当前作用域中的变量作为其命名参数的默认值?

解决方法:

这是一个装饰器的解决方案:

from functools import wraps

from inspect import getcallargs

def defaults_from_globals(f):

@wraps(f)

def new(**kwargs):

# filter only those vars, that are in the list of function's named args

from_globals = {arg: globals()[arg] for arg in getcallargs(f)}

# overwrite them with user supplied kwargs

from_globals.update(kwargs)

return f(**from_gobals)

return new

@defaults_from_globals

def f(a=None, b=None, c=None):

return a, b, c

a = 1

b = 2

c = 3

print f(a=2, b=4) # 2 4 3

标签:python,default-value,optional-parameters,currying

来源: https://codeday.me/bug/20190529/1175906.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值