我对Python还是个新手。我有一个案例,我在Blender中创建几何图形。我使用枚举来定义几何体的类型。不同类型的几何体需要不同的初始化参数。例如,ICOSPHERE需要细分,而UV_SPHERE需要细分和环。
什么是Pythonic式的方法来编写一个函数来处理这个问题,本质上是一个多态的参数列表?为了调用函数,我们给它一个枚举和该枚举的适当参数,然后该函数使用开关块或其他东西来处理每种类型的枚举。我不想使用函数重载--我想要一个处理各种情况的函数。
我猜参数可能是一本字典。这会将参数的变量列表封装到单个参数中。有没有更好的方法?
发布于 2019-05-20 00:13:13
这里是一个建议,基于使用一个函数和一个枚举类。
class Geometry:
ICOSPHERE = 1
UV_SPHERE = 2
def blendrFunc(gtype, **kwargs):
arg1 = kwargs['arg1']
if gtype == Geometry.ICOSPHERE:
arg2 = kwargs['arg2']
icosphere_func(arg1, arg2)
elif gtype == Geometry.UV_SPHERE:
uvsphere_func(arg1)
if __name__ == '__main__':
blendrFunc(Geometry.ICOSPHERE, arg1 = 1, arg2 = (1, 2))
blendrFunc(Geometry.UV_SPHERE, arg1 = [3, 4])
对于灵活的论点,基本上使用关键字字典。某些关键字可以在几何体类型之间共享,或者表示不同几何体的不同对象类型。某些关键字可能是必需的,也可能不会用于其他几何图形。
通过这样做,您可以更好地处理参数。
arg = kwargs.get('arg', None)
if arg is None:
raise ValueError('UVSPHERE requires arg to be ...')
发布于 2019-05-20 00:20:17
您可以编写函数来处理任意数量的参数、关键字参数或两者。这是通过向表示参数(*
)或关键字参数(**
)的参数添加星号来实现的。
任意参数被视为一个元组:
>>> def func_with_arbitrary_args(*args):
... print(args)
... print(type(args))
... for arg in args:
... print(arg)
>>> func_with_arbitrary_args(1, 2, 3)
(1, 2, 3)
<class 'tuple'>
1
2
3
任意关键字参数作为字典:
>>> def func_with_arbitrary_kwargs(**kwargs):
... print(kwargs)
... print(type(kwargs))
... for key in kwargs:
... value = kwargs[key]
... print(key, value)
>>> func_with_arbitrary_kwargs(name='Joe', size=10)
{'name': 'Joe', 'size': 10}
<class 'dict'>
name Joe
size 10
使用这种语法,您可以将任何参数列表或关键字参数字典传递给函数,并在内部处理这些args/kwarg。
例如,您可以添加诸如if kwargs['shape'] == 'circle:'
之类的检查,以断言kwargs描述的是哪种形状,这样您就可以相应地处理它们。
此外,请注意,您可以使用列表/元组/字典的解包来使调用函数变得更加容易。同样,这是使用星号完成的,但在函数调用上,而不是在函数定义上:
>>> some_list = [1, 2, 3]
>>> func_with_arbitrary_args(*some_list)
# output ommited
>>> some_tuple = (1, 2, 3)
>>> func_with_arbitrary_args(*some_tuple)
# output ommited
>>> some_dictionary = {'name': 'Joe', 'size': 10}
>>> func_with_arbitrary_kwargs(**some_dictionary)
# output ommited
https://stackoverflow.com/questions/56209529
复制相似问题