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