对于python中的位置参数(或关键字参数),哪个对象完全支持星号(或双星号)?任何标准?

问题描述 投票:0回答:2

我使用***将参数传递给Python2中的函数,而不是问题,通常使用listsetdictionary

def func(a, b, c):
   pass

l = ['a', 'b', 'c']
func(*l)

d = {'a': 'a', 'b': 'b', 'c': 'c'}
func(**d)

然而,在Python3中,出现了用list替换dict_keys的新对象,例如dict_valuesrangemapPython2等。

虽然我已将Python3代码迁移到Python2,但我需要确定新对象是否可以支持list(dict_keys)中的前一个对象的操作,如果不是,我应该使用类型转换为原型来更改代码,例如d = {'a': 'a', 'b': 'b'} print(list(d.keys())[0]) # type-case to use list-index , 或者其他的东西。

import collections
isinstance(dict_keys, collections.Iterable)
isinstance(dict_values, collections.Iterable)
isinstance(map, collections.Iterable)
isinstance(range, collections.Iterable)

对于迭代,我可以通过以下方式弄清楚。

asterisk

看起来很清楚区分新对象是否可迭代,但问题的标题,position/keyword argument list操作怎么样?

到目前为止,所有对象都替换了asterisk并支持Iterable操作作为我的测试,但我需要明确的标准而不是手动测试。

我尝试了一些方法,但没有共同的标准。

  1. 他们都是Iterable类? 不,generator Iterator不支持。
  2. 他们都是Iterator类? 不,generator Container不支持。
  3. 他们都是map类? 没有Container类不是superclass
  4. 他们都有一个共同的Class.mro()类? 没有共同的超类(用asterisk测试)

我怎么知道对象是否支持***position/keyword argument)对*的操作?

python-3.x asterisk
2个回答
1
投票

每个可迭代的“支持”已加星标的表达;甚至是生成者和地图。然而,“一个对象支持*”是一个误导性术语,因为这个星意味着“解压缩我的可互换并传递每个元素以便接口的参数”。因此,*运算符支持iterables。

这可能是你的问题出现的地方:你使用# a function that takes three args def fun(a, b, c): return a, b, c # a dict of some arbitrary vals: d = {'x':10, 'y':20, 'z':30} # 3 elements d2 = {'x':10, 'y':20, 'z':30, 't':0} # 4 elements 的iterables必须拥有与接口有参数一样多的元素。例如,请参阅以下代码段:

d

你可以通过多种方式将fun(*d) # valid fun(*d.keys()) # valid fun(*d.values()) # valid 传递给乐趣:

d2

但是,你不能将fun传递给fun,因为它有更多元素然后fun(*d2) # invalid 接受参数:

fun

您还可以使用星号表达式将地图传递给qazxsw poi。但请记住,map的结果必须有与fun一样多的论据。

def sq(x):
    return x**2

sq_vals = map(sq, *d.values())

fun(*sq_vals)    # Result (100, 400, 900)

对于生成器,如果它生成与函数接受参数一样多的元素,则同样适用:

def genx():
    for i in range(3):
        yield i

fun(*genx())    # Result: (0, 1, 2)

为了检查是否可以使用星号表达式将iterable解压缩到函数的接口中,您需要检查您的iterable是否具有与函数接受参数相同数量的元素。

如果你想让你的函数对不同长度的参数安全,你可以尝试重新定义你的函数,方法如下:

# this version of fun takes min. 3 arguments:
fun2(a, b, c, *args):
    return a, b, c

fun2(*range(10))    # valid
fun(*range(10))     # TypeError

0
投票

单个星号形式(* args)用于传递非keyworded,可变长度的参数列表,双星号形式用于传递keyworded,variable-length参数列表

args and kwargs explainedalso this one

© www.soinside.com 2019 - 2024. All rights reserved.