可选关键字参数的命名元组和默认值

2023-12-01

我正在尝试将一个较长的空心“数据”类转换为命名元组。我的班级目前如下所示:

class Node(object):
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

转换后为namedtuple看起来像:

from collections import namedtuple
Node = namedtuple('Node', 'val left right')

但这里有一个问题。我原来的类允许我只传递一个值,并通过使用命名/关键字参数的默认值来处理默认值。就像是:

class BinaryTree(object):
    def __init__(self, val):
        self.root = Node(val)

但这对于我重构的命名元组不起作用,因为它希望我传递所有字段。我当然可以替换出现的情况Node(val) to Node(val, None, None)但这不符合我的喜好。

那么是否存在一个好的技巧可以使我的重写成功而不增加大量代码复杂性(元编程),或者我应该吞下药丸并继续“搜索和替换”? :)


Python 3.7

Use the defaults范围。

>>> from collections import namedtuple
>>> fields = ('val', 'left', 'right')
>>> Node = namedtuple('Node', fields, defaults=(None,) * len(fields))
>>> Node()
Node(val=None, left=None, right=None)

或者更好的是,使用新的数据类库,它比namedtuple好得多。

>>> from dataclasses import dataclass
>>> from typing import Any
>>> @dataclass
... class Node:
...     val: Any = None
...     left: 'Node' = None
...     right: 'Node' = None
>>> Node()
Node(val=None, left=None, right=None)

Python 3.7 之前

Set Node.__new__.__defaults__为默认值。

>>> from collections import namedtuple
>>> Node = namedtuple('Node', 'val left right')
>>> Node.__new__.__defaults__ = (None,) * len(Node._fields)
>>> Node()
Node(val=None, left=None, right=None)

Python 2.6 之前

Set Node.__new__.func_defaults为默认值。

>>> from collections import namedtuple
>>> Node = namedtuple('Node', 'val left right')
>>> Node.__new__.func_defaults = (None,) * len(Node._fields)
>>> Node()
Node(val=None, left=None, right=None)

Order

在 Python 的所有版本中,如果您设置的默认值少于命名元组中存在的值,则默认值将应用于最右侧的参数。这允许您保留一些参数作为必需参数。

>>> Node.__new__.__defaults__ = (1,2)
>>> Node()
Traceback (most recent call last):
  ...
TypeError: __new__() missing 1 required positional argument: 'val'
>>> Node(3)
Node(val=3, left=1, right=2)

Python 2.6 到 3.6 的包装器

这是一个适合您的包装器,它甚至可以让您(可选)将默认值设置为除None。这不支持必需的参数。

import collections
def namedtuple_with_defaults(typename, field_names, default_values=()):
    T = collections.namedtuple(typename, field_names)
    T.__new__.__defaults__ = (None,) * len(T._fields)
    if isinstance(default_values, collections.Mapping):
        prototype = T(**default_values)
    else:
        prototype = T(*default_values)
    T.__new__.__defaults__ = tuple(prototype)
    return T

Example:

>>> Node = namedtuple_with_defaults('Node', 'val left right')
>>> Node()
Node(val=None, left=None, right=None)
>>> Node = namedtuple_with_defaults('Node', 'val left right', [1, 2, 3])
>>> Node()
Node(val=1, left=2, right=3)
>>> Node = namedtuple_with_defaults('Node', 'val left right', {'right':7})
>>> Node()
Node(val=None, left=None, right=7)
>>> Node(4)
Node(val=4, left=None, right=7)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

可选关键字参数的命名元组和默认值 的相关文章

  • 尽管极其懒惰,但如何在 Python 中模拟 IMAP 服务器?

    我很好奇是否有一种简单的方法来模拟 IMAP 服务器 例如imaplib模块 在Python中 without做很多工作 是否有预先存在的解决方案 理想情况下 我可以连接到现有的 IMAP 服务器 进行转储 并让模拟服务器在真实的邮箱 电子
  • Django REST序列化器:创建对象而不保存

    我已经开始使用 Django REST 框架 我想做的是使用一些 JSON 发布请求 从中创建一个 Django 模型对象 然后使用该对象而不保存它 我的 Django 模型称为 SearchRequest 我所拥有的是 api view
  • 如何在python中读取多个文件中的文本

    我的文件夹中有许多文本文件 大约有 3000 个文件 每个文件中第 193 行是唯一包含重要信息的行 我如何使用 python 将所有这些文件读入 1 个文本文件 os 模块中有一个名为 list dir 的函数 该函数返回给定目录中所有文
  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • Python PAM 模块的安全问题?

    我有兴趣编写一个 PAM 模块 该模块将利用流行的 Unix 登录身份验证机制 我过去的大部分编程经验都是使用 Python 进行的 并且我正在交互的系统已经有一个 Python API 我用谷歌搜索发现pam python http pa
  • Pycharm Python 控制台不打印输出

    我有一个从 Pycharm python 控制台调用的函数 但没有显示输出 In 2 def problem1 6 for i in range 1 101 2 print i end In 3 problem1 6 In 4 另一方面 像
  • Flask 和 uWSGI - 无法加载应用程序 0 (mountpoint='')(找不到可调用或导入错误)

    当我尝试使用 uWSGI 启动 Flask 时 出现以下错误 我是这样开始的 gt cd gt root localhost uwsgi socket 127 0 0 1 6000 file path to folder run py ca
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • 如何使用 Scrapy 从网站获取所有纯文本?

    我希望在 HTML 呈现后 可以从网站上看到所有文本 我正在使用 Scrapy 框架使用 Python 工作 和xpath body text 我能够获取它 但是带有 HTML 标签 而且我只想要文本 有什么解决办法吗 最简单的选择是ext
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • 如何使用装饰器禁用某些功能的中间件?

    我想模仿的行为csrf exempt see here https docs djangoproject com en 1 11 ref csrf django views decorators csrf csrf exempt and h
  • 运行多个 scrapy 蜘蛛的正确方法

    我只是尝试使用在同一进程中运行多个蜘蛛新的 scrapy 文档 http doc scrapy org en 1 0 topics practices html但我得到 AttributeError CrawlerProcess objec
  • IRichBolt 在storm-1.0.0 和 pyleus-0.3.0 上运行拓扑时出错

    我正在运行风暴拓扑 pyleus verbose local xyz topology jar using storm 1 0 0 pyleus 0 3 0 centos 6 6并得到错误 线程 main java lang NoClass
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 如何将 PIL 图像转换为 NumPy 数组?

    如何转换 PILImage来回转换为 NumPy 数组 这样我就可以比 PIL 进行更快的像素级转换PixelAccess允许 我可以通过以下方式将其转换为 NumPy 数组 pic Image open foo jpg pix numpy
  • VSCode:调试配置中的 Python 路径无效

    对 Python 和 VSCode 以及 stackoverflow 非常陌生 直到最近 我已经使用了大约 3 个月 一切都很好 当尝试在调试器中运行任何基本的 Python 程序时 弹出窗口The Python path in your
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 协方差矩阵的对角元素不是 1 pandas/numpy

    我有以下数据框 A B 0 1 5 1 2 6 2 3 7 3 4 8 我想计算协方差 a df iloc 0 values b df iloc 1 values 使用 numpy 作为 cov numpy cov a b I get ar

随机推荐

  • 为什么 OS X 上的 FF 在单击事件处理程序中丢失了 jQuery-UI?

    在使用 jQUery 1 7 1 和 jQUery UI 1 8 18 的网页中 如果我在文档准备好时在警报框中输出 ui 我会得到 object Object 但是 当使用 Firefox 时 如果我在单击事件处理程序中输出 ui 则会得
  • 重用 UITableView 中的单元格

    我有我的自定义单元 NewsCell 它包含我的自定义视图 ImageMosaicView 它只是 UIView 的子类 我用它来显示照片 就像 Facebook 上发布的照片 一样 我只是将图像的 url 传递给 ImageMosaicV
  • C++成员函数隐藏的原因[重复]

    这个问题在这里已经有答案了 可能的重复 名称隐藏和脆弱的基础问题 我熟悉涉及成员函数隐藏的规则 基本上 具有与基类函数同名的函数的派生类实际上不会重载基类函数 它完全隐藏了它 struct Base void foo int x const
  • 我如何用 throw e 在开玩笑行中进行测试?

    如何在玩笑错误情况下进行测试 这就是我所做的 我不知道是否存在一种方法来测试这个 it the fetch fails and throw an error async gt let response status 400 body bas
  • Javascript API 不适用于 JW Player 5.9 上的 Chrome 或 Safari

    我正在为 JW Player 开发一个自定义界面 它显示当前曲目标题并具有播放 暂停 下一曲目 上一曲目和音量切换按钮 它适用于 IE8 9 和 FF 但不适用于 Chrome 和 Safari Chrome 的控制台出现以下错误 未捕获的
  • 将输出写入不同的文件夹 hadoop

    我想将同一个减速器的两种不同类型的输出写入两个不同的目录 我可以使用 hadoop 中的多输出功能写入不同的文件 但它们都转到相同的输出文件夹 我想将同一个reduce 中的每个文件写入不同的文件夹 有办法做到这一点吗 如果我尝试将 hel
  • 为什么方法 Base64.encodeBase64String(byte) 不可用

    您好 我已将官方网页中的 apache commons codec 1 7 jar 添加到我的项目构建路径中 但该方法Base64 encodeBase64String byte当我编写代码时不可用 我已经用旧版本的 jar 1 5 1 6
  • 动态加载 php 扩展而不使用 dl() 函数?

    这可能吗 如果可能的话 该怎么做 我问是因为dl 我无法使用该函数 因为 PHP 团队正在从后续版本中放弃该函数 请不要回答 改用扩展加载指令 这正是我不明白的部分 我想 我要问 The 函数已从所有 SAPI 中删除other自 PHP
  • php 命令行性能缓慢 - 这是正常现象还是我有安装问题?

    我有一个简单的 PHP 应用程序 可以打印 hello world 当我从命令行运行它时 需要 6 秒 这是正常的吗 似乎需要 1 秒才能打印 hello world 然后又需要 5 秒 我在 Windows Server 2008 R2
  • 链接升压日志教程时出现链接器错误(未定义的引用)

    我已经通过 yum 在 Fedora 20 上安装了 boost 并且正在尝试一些简单的示例 但是我在编译第一个示例时遇到了麻烦日志记录教程 编译用g c boosttest cc工作正常 但是当我尝试将其链接到时出现很多错误 g boos
  • 在 HQL 上使用 select 进行内连接

    我想用 HQL 做类似的事情 SELECT FROM tableA a INNER JOIN select fieldA sum fieldB as sum from tableB b ON a fieldA b fieldA and a
  • 为什么 Class 变量没有更新其所有实例?

    我正在学习课程 但不明白这一点 class MyClass var 1 one MyClass two MyClass print one var two var out 1 1 one var 2 print one var two va
  • MultiView Android Delphi 与 TWebBrowser

    在包含 TWebBrowser 的区域中使用 MultiView 组件 该组件会覆盖 MultiView 有没有办法来解决这个问题 用法 德尔福XE8更新1 第一个测试中没有代码 所有配置均通过 MultiView 实现可视化 使用 TWe
  • UIView动画在动画过程中确定中心

    我正在使用 UIView 的 animateWithDuration delay options animations completion 方法在几秒钟左右的时间内沿着一条线移动我的视图 我想在该动画期间的任意时间确定 UIView 及其
  • 如何将数组从一个 Servlet 传递到另一个 Servlet?

    我想将多个值从一个 servlet 传递到另一个 servlet 请告诉我如何通过 You can 使用以下命令将数组作为属性放入请求上下文中request setAttribute 使用以下命令将请求转发到第二个 servletReque
  • 宏 ((void(*)())0)() 是什么意思?

    以下宏的结果很清楚 define CRASH do int uintptr t 0xbbadbeef 0 void 0 while false 我的问题是 这条线是什么 void 0 分解为 用英语 例如 这是一个返回指向 的指针的函数 看
  • 如何消除应用栏上的弹跳效果?

    应用栏过去在滑动时会出现问题 它滚动得不顺畅 请参考这些 http stackoverflow com questions 30923889 flinging with recyclerview appbarlayout https git
  • 查询在函数内部不起作用

    嗯 我在 SMF 的自定义脚本中有这个函数 query SELECT id member real name id group FROM smf members WHERE id group gt 0 AND id group 9 AND
  • 如何垂直居中 Bootstrap 轮播标题?

    我有一个引导轮播 我正在尝试为轮播创建一个标题 该标题始终垂直居中并稍微向左定位 我有用于水平定位的CSS 但是当我尝试垂直定位时 标题不会保持原样 如何保持 carousel caption 始终垂直居中并稍微偏左 HTML div cl
  • 可选关键字参数的命名元组和默认值

    我正在尝试将一个较长的空心 数据 类转换为命名元组 我的班级目前如下所示 class Node object def init self val left None right None self val val self left lef