在Python的2.x的(我用2.7),这是使用默认参数用正确的方式*args
和**kwargs
?
我在SO上找到了一个与此主题相关的问题,但这适用于Python 3:
使用*args,**kwargs和可选/默认参数调用Python函数
在那里,他们说这种方法有效:
def func(arg1, arg2, *args, opt_arg='def_val', **kwargs):
#...
Run Code Online (Sandbox Code Playgroud)
在2.7中,它导致a SyntaxError
.有没有推荐的方法来定义这样的功能?
我用这种方式工作,但我猜有更好的解决方案.
def func(arg1, arg2, *args, **kwargs):
opt_arg ='def_val'
if kwargs.__contains__('opt_arg'):
opt_arg = kwargs['opt_arg']
#...
Run Code Online (Sandbox Code Playgroud) 可以说我有
class Super():
def method1():
pass
class Sub(Super):
def method1(param1, param2, param3):
stuff
Run Code Online (Sandbox Code Playgroud)
它是否正确?对method1的调用总是会转到子类吗?我的计划是让2个子类重写方法1,使用不同的参数
在python中我们可以这样做:
def myFun1(one = '1', two = '2'):
...
Run Code Online (Sandbox Code Playgroud)
然后我们可以调用函数并按名称传递参数:
myFun1(two = 'two', one = 'one')
Run Code Online (Sandbox Code Playgroud)
此外,我们可以这样做:
def myFun2(**kwargs):
print kwargs.get('one', 'nothing here')
myFun2(one='one')
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否可以将两种方法结合起来:
def myFun3(name, lname, **other_info):
...
myFun3(lname='Someone', name='myName', city='cityName', otherInfo='blah')
Run Code Online (Sandbox Code Playgroud)
一般来说,我们可以做什么组合?
谢谢,对不起我的愚蠢问题.
在这个问题中,描述了自Python3以来你可以使用这种表示法:
def func(a, b, *args, kw1=None, **kwargs)
Run Code Online (Sandbox Code Playgroud)
定义一个函数,而不是传统的Python2方式:
def func(a, b, kw1=None, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
是否有任何商定的最佳做法,应使用哪种签名,还是基于个人喜好?
我有以下代码:
def foo(func, *args, named_arg = None):
return func(*args)
Run Code Online (Sandbox Code Playgroud)
返回SyntaxError
:
File "tester3.py", line 3
def foo(func, *args, named_arg = None):
^
Run Code Online (Sandbox Code Playgroud)
这是为什么?是否有可能以某种方式定义一个函数,它接受一个参数(func
),然后是args
命名参数之前的变量参数列表?如果没有,我的可能性是什么?
我正在尝试在 Python 3 (Python 3.7.0) 中使用args
和kwargs
解决问题,但我的理解遇到了一些问题。
这是我有一个简单的功能:
def add_args(y=10, *args, **kwargs):
return y, args, kwargs
Run Code Online (Sandbox Code Playgroud)
并测试它以查看返回的内容:
print(add_args(1, 5, 10, 20, 50))
print(add_args())
>>
(1, (5, 10, 20, 50), {}) # What happened to my default y=10?
(10, (), {})
Run Code Online (Sandbox Code Playgroud)
我不明白的是,y=10
第一个打印语句中发生了什么?我可以看到它被1
in覆盖,args
但我不确定为什么。
我怎样才能重写这个函数,这样默认值就不会被覆盖,或者我是否遗漏了参数从函数签名传递到 return 语句的方式?
python ×6
function ×2
args ×1
arguments ×1
inheritance ×1
kwargs ×1
methods ×1
overriding ×1
pass-by-name ×1
python-2.7 ×1
python-3.x ×1