Python 中的级联可选参数
Cascading optional parameters in Python
我有一系列 类 可以通过选择性地传递参数来创建,或者如果省略,它将使用默认数据结构。所有 类 都以相同的方式工作,因此:
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的方式来做到这一点?我看过其他问题/答案,但似乎没有比上面更好的了。
您可以更改形状 classes 以将 None
作为默认参数并在构造函数中处理 None 情况。
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
那你直接使用出厂默认参数就可以了class:
def create_shape(key, vertices=None):
if key == 'square':
return square(vertices)
elif key == 'triangle':
return triangle(vertices)
如果你想传递可选参数给你的函数,你可以使用**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)])
您的三角形 class 的初始化函数将接收新的顶点值。
我有一系列 类 可以通过选择性地传递参数来创建,或者如果省略,它将使用默认数据结构。所有 类 都以相同的方式工作,因此:
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的方式来做到这一点?我看过其他问题/答案,但似乎没有比上面更好的了。
您可以更改形状 classes 以将 None
作为默认参数并在构造函数中处理 None 情况。
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
那你直接使用出厂默认参数就可以了class:
def create_shape(key, vertices=None):
if key == 'square':
return square(vertices)
elif key == 'triangle':
return triangle(vertices)
如果你想传递可选参数给你的函数,你可以使用**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)])
您的三角形 class 的初始化函数将接收新的顶点值。