python多态参数

python多态参数,python,python-3.x,Python,Python 3.x,我对Python有点陌生。我有一个在Blender中创建几何体的例子。我使用枚举来定义几何体的类型。不同类型的几何图形需要不同的初始化参数。例如,ICOSPHERE需要细分,而UV_SPHERE需要分段和环 什么是Pythonic方式来编写函数来处理这个问题,本质上是一个多态参数列表?为了调用该函数,我们给它一个枚举和该枚举的相应参数,然后该函数使用一个开关块或其他东西来处理每种类型的枚举。我不想使用函数重载——我想要一个处理各种情况的函数 我猜params可能是一本字典。这将把参数的变量列表封

我对Python有点陌生。我有一个在Blender中创建几何体的例子。我使用枚举来定义几何体的类型。不同类型的几何图形需要不同的初始化参数。例如,ICOSPHERE需要细分,而UV_SPHERE需要分段和环


什么是Pythonic方式来编写函数来处理这个问题,本质上是一个多态参数列表?为了调用该函数,我们给它一个枚举和该枚举的相应参数,然后该函数使用一个开关块或其他东西来处理每种类型的枚举。我不想使用函数重载——我想要一个处理各种情况的函数


我猜params可能是一本字典。这将把参数的变量列表封装到单个参数中。有更好的方法吗?

这里有一个建议,它基于使用一个函数和一个枚举类

类几何体:
ICOSPHERE=1
UV_球体=2
def blendrFunc(gtype,**kwargs):
arg1=kwargs['arg1']
如果gtype==Geometry.ICOSPHERE:
arg2=kwargs['arg2']
icosphere_func(arg1,arg2)
elif gtype==Geometry.UV_球体:
uvsphere_func(arg1)
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
blendrFunc(Geometry.ICOSPHERE,arg1=1,arg2=(1,2))
blendrFunc(Geometry.UV_球体,arg1=[3,4])
对于灵活的参数,基本上使用关键字词典。某些关键字可以在几何图形类型之间共享,也可以表示不同几何图形的不同对象类型。某些关键字可能是必需的,也可能不用于其他几何图形

这样做可以更好地处理争论

arg=kwargs.get('arg',无)
如果arg为None:
raise VALUERROR('UVSPHERE要求参数为…')

您可以编写函数来处理任意数量的参数、关键字参数或两者。这是通过在表示参数(
*
)或关键字参数(
**
)的参数中添加星号来实现的

任意参数被视为元组:

>>> 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

“我不想使用函数重载”。你很幸运:Python不支持函数重载。这就是我所说的“参数可以是字典”的方法。这确实有效,但我想知道还有什么其他方法。
>>> 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
>>> 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