优雅地处理不同的参数类型

Bjö*_*lex 7 python

我有一个函数,在最简单的情况下,它可以在一个可迭代的项目上运行.

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?

Chr*_*gan 2

就目前情况而言,您可能应该在这里至少使用两种方法,第三种方法只是使用结果调用第一种方法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)