好吧,我承认我没有很好地提出这个问题.我会更新我的问题更准确.
我正在编写一个以列表作为参数的函数.我想检查列表的长度,以便我可以遍历列表.
我遇到的问题是当列表只有一个条目时,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.
Run Code Online (Sandbox Code Playgroud)
我希望能够通过调用我的方法
myMethod('ed', ed.spectra,comment='down welling irradiance')
Run Code Online (Sandbox Code Playgroud)
或者
myMethod(['ed','lu'] , [ed.spectra,lu.spectra] , comments = ['downwelling', upwelling radiance'])
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.解析['ed']似乎不是什么大不了的事,但它到目前为止打破了我的API的一致性.
包含单个项目的列表的正确python语法是[ 'ed' ].
你正在做的list('ed')是要求python转换'ed'为列表.这是python中的一致隐喻:当你想将某些东西转换为字符串时,你会说str(some_thing).任何你用来list('ed')返回一个只有字符串'ed'的列表的hack 都会破坏python的内部隐喻.
当python看到时list(x),它会尝试转换x为列表.如果x是可迭代的,它会或多或少地与此相同:
def make_list(x):
ret_val = []
for item in x:
ret_val.append(item)
return ret_val
Run Code Online (Sandbox Code Playgroud)
因为你的字符串'ed'是可迭代的,所以python会将它转换为长度为2的列表:[ 'e', 'd' ].
在这种情况下,最干净的惯用python可能是让你的函数接受可变数量的参数,所以不要这样做
def my_func(itemList):
...
Run Code Online (Sandbox Code Playgroud)
你会这样做的
def my_func(*items):
...
Run Code Online (Sandbox Code Playgroud)
而不是像这样称呼它
my_func(['ed','lu','lsky'])
Run Code Online (Sandbox Code Playgroud)
你这样称呼它:
my_func('ed', 'lu', 'lsky')
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以接受任意数量的参数,并且您的API将非常干净.