需要python函数中的命名参数

时间:2016-02-20 10:13:51

标签: python named-parameters

我创建了一个类,我想给用户(可能是我)两种不同的方法来初始化它。对于此示例,该类称为Box,我想用以下任一方式初始化它:

  1. 两组笛卡尔坐标,分别代表最小值和最大值(x,y)。

  2. 一组表示最小值和方框尺寸的笛卡尔坐标

  3. 我可以通过使用命名参数来完成此操作,但是如果没有调用命名参数,我想引发错误。在没有调用命名参数的情况下,我当前的代码在被调用pass_var中放置一个伪参数。它有效,但我认为必须有更优雅或Pythonic的解决方案。

    class Box(object):
    
        def __init__(self, pass_var=None, coordinates=None, min_points=None, dimensions=None):
            if coordinates:
                setup_box_from_coordinates()
                return
            elif min_points and dimensions:
                setup_box_from_dimensions()
                return
            raise NameError("Box Class needs to be initiated with 'coordinates='' or 'min_pts= & dimensions='"
    

1 个答案:

答案 0 :(得分:6)

如果您使用的是Python 3.x,则可以使用*来防止不必要的位置 参数:

class Box(object):

    def __init__(self, *, coordinates=None, min_points=None, dimensions=None):
        ...

在2.x中,您不会自动收到错误,但可以执行以下操作:

class Box(object):

    def __init__(self, *args, coordinates=None, min_points=None, dimensions=None):
        if args:
            raise TypeError('positional arguments not supported')
        ...

但是,提供创建类的不同方法的传统方法是使用类方法,例如:

class Box(object):

    @classmethod
    def from_coordinates(cls, coordinates):
        ...

    @classmethod
    def from_min_dimensions(cls, min_, dimensions):
        ...