我有一个函数,在最简单的情况下,它可以在一个可迭代的项目上运行.
def foo(items):
for item in items:
# do stuff
Run Code Online (Sandbox Code Playgroud)
有时候,我不想直接传递一个可迭代的项目,而是一个提供获取可迭代的方法的对象:
def foo(obj):
for item in obj.iteritems():
# do same stuff as above
Run Code Online (Sandbox Code Playgroud)
我可以像这样合并这两种情况:
def foo(obj):
try:
items = obj.iteritems()
except ValueError:
items = obj
for item in items:
# do stuff
Run Code Online (Sandbox Code Playgroud)
这很好用.现在我得到第三个用例,如下所示:
def foo(objs):
for item in itertools.chain.from_iterable(obj.iteritems() for obj in objs):
# do same stuff again
Run Code Online (Sandbox Code Playgroud)
我仍然可以使用这种try-except方法,因为接口是不兼容的.但是,嵌套的try catch会变得非常难看.当我想添加第四个用例时更是如此.有没有办法解决这个问题而不嵌套try-blocks?
就目前情况而言,您可能应该在这里至少使用两种方法,第三种方法只是使用结果调用第一种方法itertools.chain.from_iterable。您还可以使用 *args; 这取决于您的具体情况(提供真实的例子会很有帮助)。您还可以使用简单的辅助函数来返回正确类型的迭代器。
也许这可能会解决:
def _foo_iter(obj):
try:
return obj.iteritems()
except AttributeError:
return obj
def foo(*objs):
for obj in objs:
for item in _foo_iter(obj):
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
309 次 |
| 最近记录: |