我使用*
或**
将参数传递给Python2
中的函数,而不是问题,通常使用list
,set
和dictionary
。
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_values
,range
,map
,Python2
等。
虽然我已将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
操作作为我的测试,但我需要明确的标准而不是手动测试。
我尝试了一些方法,但没有共同的标准。
Iterable
类?
不,generator
Iterator
不支持。Iterator
类?
不,generator
Container
不支持。map
类?
没有Container
类不是superclass
Class.mro()
类?
没有共同的超类(用asterisk
测试)我怎么知道对象是否支持*
(**
,position/keyword argument
)对*
的操作?
每个可迭代的“支持”已加星标的表达;甚至是生成者和地图。然而,“一个对象支持*
”是一个误导性术语,因为这个星意味着“解压缩我的可互换并传递每个元素以便接口的参数”。因此,*
运算符支持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
单个星号形式(* args)用于传递非keyworded,可变长度的参数列表,双星号形式用于传递keyworded,variable-length参数列表