当前位置:  开发笔记 > 编程语言 > 正文

*args和**kwargs是什么意思?

如何解决《*args和**kwargs是什么意思?》经验,为你挑选了5个好方法。

究竟是什么*args**kwargs意味着什么呢?

根据Python文档,从它看来,它传递了一个参数元组.

def foo(hello, *args):
    print hello

    for each in args:
        print each

if __name__ == '__main__':
    foo("LOVE", ["lol", "lololol"])

打印出:

LOVE
['lol', 'lololol']

你如何有效地使用它们?



1> Paul D. Wait..:

在函数定义的参数列表中放置*args和/或**kwargs作为最后一项允许该函数接受任意数量的参数和/或关键字参数.

例如,如果你想编写一个函数来返回所有参数的总和,无论你提供了多少,你都可以像这样写:

def my_sum(*args):
    return sum(args)

当你覆盖一个函数时,它可能更常用于面向对象的编程,并希望用用户传入的任何参数调用原始函数.

你实际上并没有给他们打电话argskwargs,这只是一个惯例.这是***该做的魔力.

官方Python文档具有更深入的外观.


也许链接到深入解释这个问题的教程,每个人都应该阅读:http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions
没有汗,你是非常受欢迎的.也困惑了我一段时间.如果你认真对待Python,我会衷心推荐Mark Lutz的"Programming Python".
@PaulD.Waite:没问题.我想知道有多少新手通过尝试使用你的代码发现了这个错误,但是告诉自己"_我必须在这里做错事,这个答案有这么多的投票_";)另一个我的投票,因为它非常明确和非常好.
@scorpiodawg链接只有答案是不受欢迎的,因为他们链接到的网站可能会消失,让答案对未来的访问者毫无用处.

2> S.Lott..:

此外,我们使用它们来管理继承.

class Super( object ):
   def __init__( self, this, that ):
       self.this = this
       self.that = that

class Sub( Super ):
   def __init__( self, myStuff, *args, **kw ):
       super( Sub, self ).__init__( *args, **kw )
       self.myStuff= myStuff

x= Super( 2.7, 3.1 )
y= Sub( "green", 7, 6 )

这种方式Sub并不真正知道(或关心)超类初始化是什么.如果您意识到需要更改超类,您可以解决问题,而不必为每个子类中的细节烦恼.


这是我在如何使用`super`时找到的最有用的答案之一.这个答案超过5年,但我想这仍然是在Python 2.X中使用`super`的好方法,对吗?

3> orip..:

注意S.Lott注释中很酷的东西- 你也可以使用*mylist和调用函数**mydict来解析位置和关键字参数:

def foo(a, b, c, d):
  print a, b, c, d

l = [0, 1]
d = {"d":3, "c":2}

foo(*l, **d)

将打印: 0 1 2 3



4> orip..:

另一个很好用的*args**kwargs:你可以定义通用的"catch all"函数,这对于返回这样一个包装器而不是原始函数的装饰器来说非常有用.

一个简单的缓存装饰器的例子:

import pickle, functools
def cache(f):
  _cache = {}
  def wrapper(*args, **kwargs):
    key = pickle.dumps((args, kwargs))
    if key not in _cache:
      _cache[key] = f(*args, **kwargs) # call the wrapped function, save in cache
    return _cache[key] # read value from cache
  functools.update_wrapper(wrapper, f) # update wrapper's metadata
  return wrapper

import time
@cache
def foo(n):
  time.sleep(2)
  return n*2

foo(10) # first call with parameter 10, sleeps
foo(10) # returns immediately



5> Kaushik Ghos..:

只是为了澄清如何解包参数,并处理缺少的参数等.

def func(**keyword_args):
  #-->keyword_args is a dictionary
  print 'func:'
  print keyword_args
  if keyword_args.has_key('b'): print keyword_args['b']
  if keyword_args.has_key('c'): print keyword_args['c']

def func2(*positional_args):
  #-->positional_args is a tuple
  print 'func2:'
  print positional_args
  if len(positional_args) > 1:
    print positional_args[1]

def func3(*positional_args, **keyword_args):
  #It is an error to switch the order ie. def func3(**keyword_args, *positional_args):
  print 'func3:'
  print positional_args
  print keyword_args

func(a='apple',b='banana')
func(c='candle')
func2('apple','banana')#It is an error to do func2(a='apple',b='banana')
func3('apple','banana',a='apple',b='banana')
func3('apple',b='banana')#It is an error to do func3(b='banana','apple')

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有