好吧,我承认我问得不太好。我会更新我的问题,使之更精确。
我正在编写一个函数,它以列表作为参数。我想检查一下列表的长度,这样我就可以遍历列表了。
我遇到的问题是,当列表只有一个条目时,len(myList)返回该条目的长度(字符串的长度),而不是应该等于1的列表的长度。
如果强制将参数解析为单个值列表['val'],我可以修复此问题。但我更希望我的API允许用户解析一个值或一个值列表。
示例:
def myMethod(self,dataHandle, data,**kwargs):
comment = kwargs.get('comment','')
_dataHandle= list()
_data = list()
_dataHandle.append(dataHandle)
_data.append(data)
for i in range(_dataHandle):
# do stuff.
我希望能够调用我的方法
myMethod('ed', ed.spectra,comment='down welling irradiance')
或由
myMethod(['ed','lu'] , [ed.spectra,lu.spectra] , comments = ['downwelling', upwelling radiance'])
任何帮助都将不胜感激。解析['ed']似乎没什么大不了的,但到目前为止它破坏了我的API的一致性。
您可以询问变量是否为
list
:编辑:另一个选项是尝试遍历它,如果失败(引发和异常),则假设是单个元素:
第二个选项的好处是,它不仅可以作为第一个选项用于
list
s,还可以用于任何可iterable(string
s、set
s、dict
s等)的对象如果你想把字符串当作一个列表来处理,实际上你需要把它放到一个列表中
编辑
我看到在某个时刻,字符串前面有一个
list
。list
与您的想法相反,它不会创建一个项的列表。它对string对象调用__iter__
,并遍历每个项。因此它列出了一个字符列表。希望这能更清楚地说明:
由单个项组成的列表的正确python语法是
[ 'ed' ]
。使用
list('ed')
所做的是要求python将'ed'
转换为列表。这在python中是一个一致的隐喻:当你想把某个东西转换成字符串时,你会说str(some_thing)
。任何让list('ed')
返回一个只有字符串“ed”的列表的方法都会破坏python的内部隐喻。当python看到
list(x)
时,它将尝试将x
转换为列表。如果x
是iterable,它会做一些或多或少相当于这样的事情:因为字符串'ed'是iterable,python会将其转换为长度为2的列表:
[ 'e', 'd' ]
。在这种情况下,最干净的惯用python可能是让您的函数接受可变数量的参数,因此
你会这么做的
而不是这样称呼
你可以这样称呼它:
通过这种方式,您可以接受任意数量的参数,并且您的API将是干净的。
相关问题 更多 >
编程相关推荐