python函数使用多个默认值或根本没有默认值

时间:2013-07-23 07:45:38

标签: python function default

我正在定义一个代表向量的类:

'''
An entity with size and direction
'''
UNINITIALIZED = -1

class myVector():    
    def __init__(self,direction = UNINITIALIZED,size = UNINITIALIZED):
        self.direction = direction
        self.size = size

对于使用该课程,我想象两个场景:要么我知道启动时矢量的charecharistics,然后使用这些值启动它:

v = myVector(4,2)

或者我在启发时不知道这些,然后我很高兴它会得到默认值。

然而,通过上述实现,实现了第三种情况 - 仅使用启动向量 第一个论点:

v = myVector(4)

在这种情况下,只会为第二个参数( size )分配默认值,并且生成的对象没有多大意义。

正如我所看到的,在这种情况下所需的行为要么使用两个参数,要么都不使用。实现这一点的一种方法是在这种情况下引发异常。

def __init__(self,direction = UNINITIALIZED,size = UNINITIALIZED):
    if (direction != UNINITIALIZED) and (size == UNINITIALIZED):
        raise Exception('Use both parameters or none') 
    self.direction = direction
    self.size = size

你认为优雅地做这个的pythonic方式是什么?

3 个答案:

答案 0 :(得分:3)

尺寸和方向对我来说就像一个元组:

class myVector():    
    def __init__(self, sd=(UNINITIALIZED, UNINITIALIZED)):
       try:
           self.size, self.direction = sd
       except (ValueError, TypeError) as e:
           raise ValueError('two values of size and direction must be specified')

如果不需要默认值,则使用大小和方向的元组调用它。

如果您不想将语义更改为要求传递元组,那么如果您不使用其他参数,则可以将sd更改为*args并执行相同的操作 - 这似乎不太明确我虽然意味着你不能使用可选的args。

答案 1 :(得分:1)

您也可以像这样定义类:

class myVector():
    def __init__(self,*direction_and_size):
        if not len(direction_and_size):
            direction_and_size = [UNINITIALIZED, UNINITIALIZED]
        assert len(direction_and_size) == 2, "Please provide both parameters"
        self.direction,  self.size = direction_and_size

>>> v = myVector()
>>> v = myVector(4,2)
>>> v = myVector(4)
AssertionError: Please provide both parameters

答案 2 :(得分:1)

这样的东西?

class myVector():
    def __init__(self, direction = -1, size = -1):
        if (-1 in (direction, size)):
            self.size, self.direction = (-1, -1) #do your own fault/error handling here
                                                 #this just makes the example easier
        else:
            self.size = size,
            self.direction = direction

c1 = myVector(1, 1)
c2 = myVector(1)
c3 = myVector()

print(c1.direction, c2.direction, c3.direction)

输出:
    1 -1 -1