当前位置: 首页 > news >正文

【Python 代码进阶-2】Python 中的 **(...)语法,字典解包操作符

文章目录

  • `**(...)` 语法解释
    • 详细解释
    • 实际效果
      • 当 `using_cond` 为 `True` 时:
      • 当 `using_cond` 为 `False` 时:
    • 为什么使用这种语法?
    • 其他常见用例


**(...) 语法解释

在 Python 中,**(...)语法是字典解包操作符,用于将字典中的键值对作为关键字参数传递给函数。这是一种非常强大的语法,允许动态构建函数调用的参数。

详细解释

在以下示例代码片段中:

attn_output = attn_forward(
    self.attn,
    model_config=model_config,
    hidden_states=norm_hidden_states,
    image_rotary_emb=image_rotary_emb,
    **(
        {
            "condition_latents": norm_condition_latents,
            "cond_rotary_emb": cond_rotary_emb if using_cond else None,
        }
        if using_cond
        else {}
    ),
)

这里的 **(...)部分是在做以下操作:

  1. 首先,根据 using_cond 的值评估条件表达式:

    {
        "condition_latents": norm_condition_latents,
        "cond_rotary_emb": cond_rotary_emb if using_cond else None,
    }
    if using_cond
    else {}
    
  2. 如果 using_condTrue,则创建包含两个键值对的字典

  3. 如果 using_condFalse,则创建一个空字典 {}

  4. 然后,使用 ** 操作符将这个字典解包为关键字参数

实际效果

这段代码的实际效果是:

using_condTrue 时:

attn_output = attn_forward(
    self.attn,
    model_config=model_config,
    hidden_states=norm_hidden_states,
    image_rotary_emb=image_rotary_emb,
    condition_latents=norm_condition_latents,
    cond_rotary_emb=cond_rotary_emb if using_cond else None,
)

using_condFalse 时:

attn_output = attn_forward(
    self.attn,
    model_config=model_config,
    hidden_states=norm_hidden_states,
    image_rotary_emb=image_rotary_emb,
)

为什么使用这种语法?

这种语法提供了几个优点:

  1. 条件参数传递:只在特定条件下传递某些参数
  2. 代码简洁性:避免了冗长的条件语句
  3. 灵活性:允许根据运行时条件动态构建函数调用

其他常见用例

这种语法在 Python 中有多种用途:

# 合并字典
params1 = {"a": 1, "b": 2}
params2 = {"c": 3, "d": 4}
combined = {**params1, **params2}  # {"a": 1, "b": 2, "c": 3, "d": 4}

# 带默认值的配置
defaults = {"timeout": 30, "retries": 3}
user_config = {"timeout": 60}
final_config = {**defaults, **user_config}  # {"timeout": 60, "retries": 3}

# 函数调用中的可选参数
def request(url, **kwargs):
    # 处理请求
    pass

options = {} if simple_mode else {"headers": custom_headers, "timeout": 60}
request("https://example.com", **options)

在您的代码中,这种模式使得 attn_forward 函数可以灵活地处理有条件和无条件的情况,而不需要在函数内部添加大量的条件检查。

相关文章:

  • 虫洞数观系列一 | 豆瓣电影TOP250数据采集与MySQL存储实战
  • 阿里巴巴1688类网站高保真原型设计
  • 国产化适配 - YashanDB、达梦数据库与MySQL 的兼容性及技术选型对比分析
  • 重学vue3(三):vue3基本语法及使用
  • AI驱动下的智能异常处置:海量多元异构数据的挑战与应对
  • 二分查找(二分答案)套路模板
  • JavaScript 改变 HTML 样式
  • 给Web开发者的HarmonyOS指南01-文本样式
  • Spring AI Alibaba ImageModel使用
  • vue的项目添加全局接口请求封装,并通过配置文件使接口请求变得更简洁易用
  • 13.2 kubelet containerRuntime接口定义和初始化
  • Java操作RabbitMQ
  • BCC-应用程序组件分析
  • 【身份安全】零信任安全框架梳理(一)
  • 如何在 Postman 中导入和导出 cURL 命令?
  • 用C/C++实现针对整数的BoomFilter
  • 解决Vmware 运行虚拟机Ubuntu22.04卡顿、终端打字延迟问题
  • 【每日论文】MetaSpatial: Reinforcing 3D Spatial Reasoning in VLMs for the Metaverse
  • 聊聊spring ai的mcp server
  • 基于gork的三端互联海陆空学习方案
  • IPO周报|4月最后2只新股周一申购,今年以来最低价股来了
  • 高璞任中国第一汽车集团有限公司党委常委、副总经理
  • 驻美国使馆发言人就美方希就关税问题与中方对话答记者问
  • 青海一只人工繁育秃鹫雏鸟破壳后脱险成活,有望填补国内空白
  • 中国驻英国大使郑泽光:中国反制美国关税是为了维护国际公平正义和多边贸易体制
  • “养老规划师”实则售卖保险,媒体:多部门须合力整治乱象