首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Pythonic多态参数

Pythonic多态参数
EN

Stack Overflow用户
提问于 2019-05-19 23:57:10
回答 2查看 52关注 0票数 2

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-20 00:13:13

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

代码语言:javascript
复制
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])

对于灵活的论点,基本上使用关键字字典。某些关键字可以在几何体类型之间共享,或者表示不同几何体的不同对象类型。某些关键字可能是必需的,也可能不会用于其他几何图形。

通过这样做,您可以更好地处理参数。

代码语言:javascript
复制
arg = kwargs.get('arg', None)
if arg is None:
    raise ValueError('UVSPHERE requires arg to be ...')
票数 1
EN

Stack Overflow用户

发布于 2019-05-20 00:20:17

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

任意参数被视为一个元组:

代码语言:javascript
复制
>>> 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

任意关键字参数作为字典:

代码语言:javascript
复制
>>> 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描述的是哪种形状,这样您就可以相应地处理它们。

此外,请注意,您可以使用列表/元组/字典的解包来使调用函数变得更加容易。同样,这是使用星号完成的,但在函数调用上,而不是在函数定义上:

代码语言:javascript
复制
>>> 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56209529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档