我正在定义一个表示向量的类:
'''
An entity with size and direction
'''
UNINITIALIZED = -1
class myVector():
def __init__(self,direction = UNINITIALIZED,size = UNINITIALIZED):
self.direction = direction
self.size = size
为了使用这个类,我设想了 2 个场景:要么我知道向量在启动时的特征,然后用这些值启动它:
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 方式是什么?
最佳答案
大小和方向对我来说就像一个元组:
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
并执行相同的操作 - 即不过对我来说似乎不太明确,这意味着您不能将可选参数用于其他任何事情。
关于python函数使用多个默认值或根本没有默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17804286/