嵌套 If/Else 的更简洁替代方案

2023-12-20

我主要关注 create_animal 中 if/else 的替代方案。如果有更专业的方法来处理这个问题。

在这种情况下,它是一个基于确定动物是什么所需的可变数量特征的分类器。由于人类是唯一会说英语的动物,因此该属性就足够了。但如果熊和狮子只是咆哮,则需要额外的栖息地来解决这个问题。我知道我可以更简洁地对这些条件进行分组,但这不是我想要说明的。

class Human:
    self.family = 'Hominidae'
    self.order = 'Primate'

class Bear:
    self.family = 'Ursidae'
    self.order = 'Carnivora'

class Lion:
    self.family = 'Felidae'
    self.order = 'Carnivora'
    
def create_animal(language, roars, habitat):
    if language == 'English':
        return Human()
    elif roars == True:
        if habitat == 'forest':
            return Bear()
        elif habitat == 'savannah':
            return Lion()

animal1 = create_animal(None, roars=True,habitat='forest') # Will be a bear
animal2 = create_animal(language = 'English', roars=False,habitat='town') # Will be a human
animal3 = create_animal(language = None, roars=True,habitat='savannah') # Will be a lion

这会起作用,但对于一些现实世界的复杂性,我不喜欢嵌套的 if/else 变得多么令人讨厌,我认为必须有一个很好的方法来使用这样的分类图来做到这一点,但我不确定如何去接近它。

species_classification_map = {
    'speaks_english':Human(),
    'roars':{
        'forest':Bear(),
        'savannah':Lion()
    }}

至少标准化您的函数输入的一个选项是让每种动物按其语言和栖息地进行分类并将其存储在字典中

class Human():
    def __init__(self):
        self.family = 'Hominidae'
        self.order = 'Primate'

class Bear():
    def __init__(self):
        self.family = 'Ursidae'
        self.order = 'Carnivora'

class Lion():
    def __init__(self):
        self.family = 'Felidae'
        self.order = 'Carnivora'
    
def create_animal(language, habitat):
    #dict of language, habitat
    animals={('english','civilization'):Human(),
            ('roars','forest'):Bear(),
            ('roars','savannah'):Lion()}
    #human habitat could also be None for simplicity
    return animals[(language,habitat)]

b=create_animal('roars','forest')
b
<__main__.Bear at 0x210c8795460>

some_dude=create_animal('english','civilization')
some_dude
<__main__.Human at 0x210c87953a0>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌套 If/Else 的更简洁替代方案 的相关文章

随机推荐

  • 使用带有 '\xae' 的元素转义列表并打印结果

    我有一个清单L u steve u micheal u pedro xae 当我尝试阅读它时 出现错误 我相信它与 xae 有关 gt gt gt L u steve u micheal u pedro xae gt gt gt gt gt
  • 从java voip开始[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我必须编写一个聊天应用程序 能够使用
  • 无法 npm 安装 canvas [Windows 上的 NodeJs]?

    我正在尝试使用 ag psd 包来操作 psd 文件 它仅适用于结构 但如果您也想读取图像数据 则会遇到错误 错误如下 Cannot find module canvas code MODULE NOT FOUND 但如果我尝试安装画布 我
  • 每个派生表必须有自己的别名 - 来自组合降序 MySQL 的错误

    我想通过来自两个不同列的两个 strtotime 时间戳对一个 mysql 表进行排序 我有以下 mysql 命令 SELECT FROM SELECT 1 AS table vid req timestamp AS timestamp t
  • 失败 [INSTALL_FAILED_INVALID_APK]

    当我单击运行刚刚在 Android Studio 0 2 10 中创建的项目并选择我的 Android 通过 USB 连接并通过 USB 进行调试 时 出现以下错误 Waiting for device Target device 0123
  • Twilio 未通过 AWS Lambda 实时发送 WhatsApp 消息

    很抱歉这篇文章很长 但这只是为了更好地解释 因为英语不是我的母语 我正在使用 API Gateway Lambda 通过 POST 请求发送 WhatsApp 消息 我遇到过这种奇怪的行为 看起来 Twilio 需要在 2 个请求或一段时间
  • 如何为 flutter 中的资产创建 APK 扩展文件

    我创建了一个 flutter 应用程序 其中包含大小约为 450mb 的视频资源 我已经在Apple应用商店中成功发布了该应用程序 但 Google Play 不接受我的 APK 因为它超过了 200mb 的限制 我尝试采用创建 APK 扩
  • 在 Visual Studio 2015 中使用 Protractor 测试 ASP.NET Core 应用程序

    我有一个基于核心模板包中的 angular2 模板的 ASP NET Core 项目 我添加了第二个使用 xunit 和量角器进行项目 http dotnetthoughts net end to end testing angularjs
  • 为什么自定义并发队列上的dispatch_sync会死锁

    在自定义并发dispatch queue上使用dispatch sync时 我发现我的应用程序出现间歇性死锁 我正在使用类似于中描述的方法迈克 阿什的博客 http www mikeash com pyblog friday qa 2011
  • Curl 7.43.0 不会在 MSVC 2013 中构建

    在 Visual Studio 2013 中从 cUrl 7 43 0 构建 libcurl w ssl 时 编译器报告以下错误 1 gt 构建开始 项目 libcurl 配置 DLL 调试 DLL OpenSSL DLL LibSSH2
  • 我如何滥用空合并运算符?这是否正确评估“null”?

    我试图在 Unity 的 C 脚本中使用空合并运算符 我的项目脚本运行时设置为 NET 4 x 因此它应该可以正常工作 问题在于 即使 LEFT 操作数的计算结果为 null 它也无法正确返回 RIGHT 操作数 这是一个示例声明不起作用当
  • Terraform:在另一个资源中引用在 for_each 中创建的资源

    当我有一个托管区域时 我可以轻松创建该区域 然后通过按名称引用托管区域 在委托账户中为该区域创建 NS 记录 编辑为了避免混淆 这是我想要实现的目标 但对于多个托管区域并且域的所有者是管理帐户 https dev to arswaw cre
  • 网站移动兼容性

    如何制作既兼容桌面浏览器又兼容移动浏览器的网站 针对桌面和移动设备的替代 CSS 文件有一个技巧 在 HTML header 中实现如下
  • Pygame:为什么我无法绘制圆形精灵

    我创建了以下代码 但不知道为什么无法创建圆形精灵 我真的在网上到处找 发现了同样的事情 但当我尝试它时 它不起作用 我想我只需要在更新和其他代码行之间切换 我是 pygame 的新手 所以请非常明确 谢谢 这是主要功能 import pyg
  • 在 MvcSiteMapProvider 中为具有动态参数的 DynamicNode 创建子节点

    我正在使用 MvcSiteMapProvider 2 2 1 http mvcsitemap codeplex com 并且当这些子节点具有动态参数 id 时 在动态节点下创建子节点 使用dynamicNodeProvider 时遇到问题
  • Android 中双击耳机按钮

    我使用此代码来检测广播接收器中耳机按钮的单击和双击 int d 0 Override public void onReceive Context context Intent intent String intentAction inten
  • 插入包含页脚的 UICollectionView 部分时出现问题

    我有一个典型的 UICollectionView 它以垂直方式使用 UICollectionViewFlowLayout 我正在使用带有分页的 REST API 来填充集合视图 为了触发下一页的下载 我在请求页脚布局时使用委托 UIColl
  • codeigniter 中的会话更新

    您好 我想问一下是否可以更新保存在 codeigniter 数据库中的会话数据 我有一个会话 userdata roleID name logged in 这样当有人登录时 我只需调用 data name this gt session g
  • 发送数据包之前读取 TCP 序列号

    我正在 Linux 下编写 C C 客户端 服务器程序 假设客户端要向服务器发送一条消息 m 客户端是否可以在发送 m 之前读取携带 m 的数据包的 TCP 序列号 事实上 我想append将此序列号发送给 m 并发送结果数据包 嗯 事情比
  • 嵌套 If/Else 的更简洁替代方案

    我主要关注 create animal 中 if else 的替代方案 如果有更专业的方法来处理这个问题 在这种情况下 它是一个基于确定动物是什么所需的可变数量特征的分类器 由于人类是唯一会说英语的动物 因此该属性就足够了 但如果熊和狮子只