在python函数中需要命名参数

require named parameters in python function

我已经创建了一个类,我想给用户(可能是我)两种不同的初始化方法。在这个例子中,这个类叫做Box,我想用以下两种方法初始化它:

  • 两组笛卡尔坐标,表示最小值和最大值(x,y)。

  • 一组笛卡尔坐标表示最小值和框的尺寸。

  • 我可以通过使用命名参数来实现这一点,但是如果没有调用命名参数,我想引发一个错误。在没有调用命名参数的情况下,我当前的代码将一个名为pass_var的伪参数放入其中。这是可行的,但我认为必须有一个更优雅的或Python式的解决方案。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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='"

    如果您使用的是python 3.x,那么可以使用*来防止不需要的位置参数:

    1
    2
    3
    4
    class Box(object):

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

    在2.x中,您不会自动获得错误,但可以这样做,例如:

    1
    2
    3
    4
    5
    6
    class Box(object):

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Box(object):

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

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