在Python中级联可选参数

时间:2015-11-03 11:46:47

标签: python optional-parameters

我有一系列可以通过可选地传递参数来创建的类,或者如果省略,它将使用默认数据结构。所有类都以相同的方式工作,因此:

class square(object):
    _vertices = [ (0, 0), (0, 10), (10, 10), (10, 0) ]
    def __init__(self, vertices=_vertices):
        # more stuff ...

class triangle(object):
    _vertices = [ (0, 0), (5, 10), (10, 10) ]
    def __init__(self, vertices=_vertices):
        # more stuff ...

# ... more classes

我还有一个工厂函数,它接受一个字符串并创建一个合适的对象

def create_shape(key)
    if key == 'square':
       return square()
    elif key == 'triangle':
       return triangle()

虽然很自然,但这不允许我传递顶点参数

shape1 = create_shape('square') # OK, basic creation
shape2 = create_shape('triangle', my_own_vertices) # Not OK, param 2
                                                   # can't go through factory

我的方法是按照以下方式修饰工厂,但对我来说,这似乎是一种非常笨拙的事情。

def create_shape(key, vertices=None):
    if key == 'square':
        return square(vertices) if vertices else square()
    elif key == 'triangle':
        return triangle(vertices) if vertices else triangle()

本质上,我只是想通过一个可选参数而没有顶级(create_shape)知道默认值应该是什么。有更清晰/更简单/更pythonic的方式吗?我看过其他问题/答案,但似乎没有比上面更好的了。

2 个答案:

答案 0 :(得分:5)

如果要将可选参数传递给函数,可以使用** kwags

def create_shape(key, **kwargs):
    if key == 'square':
        return square(**kwargs)
    elif key == 'triangle':
        return triangle(**kwargs)

然后,您可以像这样调用您的工厂功能。

create_shape('triangle', vertices = [( 0,0), (1, 10)])

Triangle类的init函数将接收新的顶点值。

答案 1 :(得分:1)

您可以更改形状类以将None作为默认参数,并在构造函数中处理None case。

class square(object):
    _vertices = [ (0, 0), (0, 10), (10, 10), (10, 0) ]
    def __init__(self, vertices=None):
        if not vertices: 
            vertices = _vertices
        self.vertices = vertices

然后您可以在工厂类中使用默认参数:

def create_shape(key, vertices=None):
    if key == 'square':
        return square(vertices)
    elif key == 'triangle':
        return triangle(vertices)