TypeError: strip_name() got an unexpected keyword argument ‘many‘问题的解决

引言

在读一本书《Learn Python Programming》1的第8章,按照书中的讲解先后安装了marshmallowpytest第三方库,j进而按照书中的代码结构和代码在ch08文件夹下运行pytest tests,出现如下错误:
错误结果截图
ch08中的api.py的代码为:

# ch08/api.py
'''
This program needs: pip install marshmallow; pip install pytest
'''
import os 
import csv
from copy import deepcopy

from marshmallow import Schema, fields, pre_load 
from marshmallow.validate import Length, Range 

class UserSchema(Schema):
    ''' Represent a *valid* user. '''
    email = fields.Email(required=True)
    name = fields.String(required=True, validate=Length(min=1))
    age = fields.Integer(required=True, validate=Range(min=18, max=65))
    role = fields.String()
    
    @pre_load(pass_many=False)
    def strip_name(self, data):
        data_copy = deepcopy(data)
        
        try:
            data_copy['name'] = data_copy['name'].strip()
        except (AttributeError, KeyError, TypeError):
            pass 
        return data_copy

schema = UserSchema()

def export(filename, users, overwrite=True):
    '''Export a CSV file.
    
    Create a CSV file and fill with valid users. if "overwrite"
    is False and file already exists, raise IOError.
    '''
    if not overwrite and os.path.isfile(filename):
        raise IOError(f"'{filename}' already exists")
    valid_users = get_valid_users(users)
    write_csv(filename, valid_users)
    
def get_valid_users(users):
    '''Yield one valid user at a time from users.'''
    yield from filter(is_valid, users)
def is_valid(user):
    '''Return whether or not the user is valid.'''
    return not schema.validate(user)

def write_csv(filename, users):
    '''Write a CSV given a filename and a list of users.
    
    The users are assumed to be valide for the given CSV structure.
    '''
    fieldnames = ['email', 'name', 'age', 'role']
    
    with open(filename, 'x', newline='') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()
        for user in users:
            writer.writerow(user)

ch08/tests/test_api.py中代码为:

# tests/test_api.py
import os 
from unittest.mock import patch, mock_open, call
import pytest
from ..api import is_valid, export, write_csv 

@pytest.fixture
def min_user():
    """ Represent a valid user with minimal data. """
    return {
        'email': 'minimal@example.com',
        'name': 'Primus Minimus',
        'age': 18,
    }

@pytest.fixture
def full_user():
    """Represent valid user with full data."""
    return {
        'email': 'full@example.com',
        'name': 'Minimus Primus',
        'age': 65,
        'role': 'emperor',
    }

@pytest.fixture
def users(min_user, full_user):
    """List of users, two valid and one invalid. """
    bad_user = {
        'email': 'invalid@example.com',
        'name': 'Horribilis',
    }
    return [min_user, bad_user, full_user]

class TestIsValid:
    """Test how code verifies whether a user is valid or not. """
    def test_minimal(self, min_user):
        assert is_valid(min_user)

从上面错误截图并结合代码可以分析出,该错误与我们所给出的测试数据无关,并且指向了api.py文件中的strip_name()方法。

问题解决

从事后来看,我昨晚一遇到该问题,比较慌乱和焦虑。混乱想,认为我电脑上安装的Python版本老,或者说准备在另一台台式机上重新试试代码。今早到办公室解决该问题后,冷静下来,很容易能分析出该问题的症结所在:因为方法strip_name()被装饰器@pre_load(pass_many=False)所装饰,那么问题的症结只能是第三方库marshmallow。这是马后炮,当时遇到问题时可没这么想。

看了下自己电脑上安装的的marshmallow为:marshmallow 3.19.0。又在网络上搜索了该问题,看到如下:
搜索得到的关键信息
于是将api.py代码中的strip_name()方法签名改为:

@pre_load(pass_many=False)
def strip_name(self, data, **kwargs):

仅仅增加了参数**kwargs,其他代码保持不变。运行成功,如下图所示:
运行成功结果截图

结束语

在读相对比较老的书籍时,书中的代码可能是针对老版本库的代码。而自己电脑上安装的一般是比较新的第三方包。这时,可能会出现代码错误。解决该错误的过程能提高自己的debug能力。比较蹊跷的是,上面test_api.py是单元测试代码,也就是说是测试api.py的代码,而我现在是在找出和解决test_api.py代码出现的问题,所有应该被称为元测试。如果我们把相关问题解决了,实际上是将书中的老代码更新到了新版本。

遇到问题不要慌,要淡定。冷静的分析错误根源。

Python语言很好入门,但是,应用好Python将是一个非常广阔的话题,所耗费的时间将是很多的。如果从事Python相关职业,可能长期在用。在此引用书《Learning Python》2中话与大家共勉:

Applying Python is actually a larger topic than learning Python.


  1. Fabrizio Romano. Learn Python Programming. 2ed. Packt, 2018. ↩︎

  2. Mark Lutz. Learning Python. 5ed. O’Reilly, 2013. ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/330344.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt/QML编程之路:Grid、GridLayout、GridView、Repeater(33)

GRID网格用处非常大,不仅在excel中,在GUI中,也是非常重要的一种控件。 Grid 网格是一种以网格形式定位其子项的类型。网格创建一个足够大的单元格网格,以容纳其所有子项,并将这些项从左到右、从上到下放置在单元格中。每个项目都位于其单元格的左上角,位置为(0,0)。…

K8s-架构

一、K8s节点划分 K8s集群包含Master(控制节点)和Node(工作节点),应用部署在Node节点上。 集群架构图: 二、Master节点 Master节点分成四个组件:scheduler、ApiServer、Controller Manager、ETCD。类似三层结构,controller&#…

DolphinDB 与盈米基金达成战略合作,打造领先的资管机构投顾解决方案

1月16日上午,DolphinDB 与盈米基金在上海签署战略合作协议,共同开启专业资管投顾投研合作新篇章。 DolphinDB 联合创始人、COO 初阳春与盈米基金副总裁、研究院院长杨媛春出席仪式,并代表双方完成签约。 打造市场领先的资管机构投顾服务 盈…

Spring MVC学习之——RequestMapping注解

RequestMapping注解 作用 用于建立请求URL和处理请求方法之间的对应关系。 属性 value:指定请求的实际地址,可以是一个字符串或者一个字符串列表。 value可以不写,直接在括号中写,默认就是value值 RequestMapping(value“/hel…

【征服redis5】redis的Redisson客户端

目录 1 Redisson介绍 2. 与其他Java Redis客户端的比较 3.基本的配置与连接池 3.1 依赖和SDK 3.2 配置内容解析 4 实战案例:优雅的让Hash的某个Field过期 5 Redisson的强大功能 1 Redisson介绍 Redisson 最初由 GitHub 用户 “mrniko” 创建,并在…

FreeRTOS学习第7篇--周期性延迟和相对性延迟函数

目录 FreeRTOS学习第7篇--周期性延迟和相对性延迟函数时间延迟vTaskDelay函数原型vTaskDelayUntil函数原型PrintTask_Task任务相关代码片段实验现象本文中使用的测试工程 FreeRTOS学习第7篇–周期性延迟和相对性延迟函数 本文目标:学习与使用FreeRTOS中的延迟函数&…

wox 启动的cmd无法识别npm

安装软件步骤:everything->wox->nvm->npm->yarn 新打开的任意cmd窗口均发现可以识别npm和yarn命令,但是wox启动的cmd窗口就不行 联想到cmd的特性是一个cmd窗口打开后,其运行环境就会固定,不会随着你系统环境变量的更…

常见的系统性能指标:QPS、TPS

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 系列专栏目录 [Java项目…

python/c++ Leetcode题解——118. 杨辉三角

方法一:数学 思路及解法 杨辉三角,是二项式系数在三角形中的一种几何排列。它是中国古代数学的杰出研究成果之一,它把二项式系数图形化,把组合数内在的一些代数性质直观地从图形中体现出来,是一种离散型的数与形的结合。 杨辉三角具有以下性质: 1.每行数字左右对称,由…

二进制的详细理解

二进制 什么是2进制 逢2进1的计数规则 2进制 规则:逢2进1 数字:0 1 权:128 64 32 16 8 4 2 1 基数:2 10进制计数规则 10进制 规则:逢10进1 数字:0 1 2 3 4 5 6 7 8 9 权:万 …

【图形学】探秘图形学奥秘:图形变换的解密与实战

​🌈个人主页:Sarapines Programmer🔥 系列专栏:《图形学 | 图像解码》⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。 ​ 目录 🌌1. 初识模式识别…

khbc靶场小记(upload 666靶场)

尝试上传正常的png jpg gif php的格式的文件发现老是提示烦人的消息(上传不成功); 通过抓包对MIME进行爆破没爆出来,当时可能用成小字典了; 猜测可能是把后缀名和MIME绑定检测了; 反正也没思路,…

CentOS8搭建NFS服务

一、服务端搭建——172.16.10.130 1.安装nfs,rpc服务 yum install -y rpcbind yum install -y nfs-utils2.创建共享目录 test1共享目录 mkdir /home/nfs/disk-test1 chmod 777 /home/nfs/disk-test1test2共享目录 mkdir /home/nfs/disk-test2 chmod 777 /home/nfs/disk-test…

ERROR: xtensa-Ix106-elf-gdb.exe not found!

问题: 我们使用ESP Eexception Decorder时候,报错找不到xtensa-Ix106-elf-gdb.exe执行文件,其实我们注意看输出 显示:gdbPath: C:\Users\TTJ2023\AppData\Local\Arduino15\packages\esp32\tools\xtensa-esp-elf-gdb\11.2_2022082…

算法练习-长度最小的子数组(思路+流程图+代码)

难度参考 难度:简单 分类:数组 难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。以下内容均为个人笔记,旨在督促自己认真学习。 题目 给定一个含有个正整数的数组和一个正整数s,找…

用CHAT分析高校体育智慧教学体系构建与探索研究现状

CHAT回复:现阶段,高校体育智慧教学体系的构建与探索研究还处于初级阶段,但全球数字化转型大潮的推动下,一些较为前沿的研究和实践已经开始出现: 1.教学平台的建设:很多高校已经开始尝试使用在线教育平台进行…

锂离子电池二阶RC等效电路模型参数

目前锂离子电池二阶RC等效电路模型是较多学者进行研究的模型,不同的锂离子电池模型参数有差别,但大致在这个范围内,可参考。 等效电路模型: 部分文献离线参数辨识结果: 另一文献的辨识结果:

e2studio开发三轴加速度计LIS2DW12(3)----检测活动和静止状态

e2studio开发三轴加速度计LIS2DW12.3--检测活动和静止状态 概述视频教学样品申请源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()…

【刷题】 leetcode 2 .两数相加

两数相加 两数相加1 思路一 (暴毙版)2 思路二 (本质出发) 谢谢阅读Thanks♪(・ω・)ノ下一篇文章见!!!!!! 两数相加 我们来看…

系统架构的演变:从单体到微服务的旅程

文章目录 前言一、单体架构简图 二、垂直架构简图 三、水平架构简图 四、面向服务架构(SOA)简图 五、微服务架构简图 总结 前言 随着信息技术的快速发展,系统架构也在不断演变。从早期的单体架构到现代的微服务架构,每一次的变革都…