让Python代码再次健壮

Make your Python code stronger!

Posted by Daniel's Blog on December 7, 2024

用户会给你填写奇奇怪怪的东西,你想好怎么应对了吗?今天在刷leetcode的pandas,2885. Rename Columns,有感而发。

直接看题目吧,其实很简单,但是我现在会想,万一有的测试样例里面,Column Name不是这四个,或者顺序错了怎么办。偷懒可以直接令columns = [,,,,,,],但是如果顺序不对,缺少或者更多,程序都会报错。

DataFrame students +————-+——–+ | Column Name | Type | +————-+——–+ | id | int | | first | object | | last | object | | age | int | +————-+——–+ Write a solution to rename the columns as follows:

id to student_id first to first_name last to last_name age to age_in_years

所以我选择了更稳健的写法,如下。使用dict的get方法可以轻松处理异常。

1
2
3
4
5
6
7
8
9
10
11
12
import pandas as pd

def renameColumns(students: pd.DataFrame) -> pd.DataFrame:
    rename_dct = {
        'id':'student_id',
        'first':'first_name',
        'last':'last_name',
        'age':'age_in_years'
    }
    
    students.columns = [rename_dct.get(x, x) for x in students.columns]
    return students

以往的代码我习惯于独立开发,因此每个参数的递交,在我的体系里都有严格规定。尽管Python没有C++的强类别要求,但是在理想情况下,某个函数得到的相关参数一定是被理想提交的。要求是整数2,就不能有字符串’2’。

比如说,在一个填写年龄的地方,不同的用户填写了20、30岁、廿三这样的变量。这看起来很离谱,但我有时候习惯把日期写作mm/dd/yyyy的形式。有时候是很抓狂的,你说这到底是mm/dd还是dd/mm?所以我会把月份用三位字母代替,比如10/Oct/2024,甚至简化成10OCT24.

不一定会报错,报错也是小概率事件,但是强调事前预防。一步到位,否则后面debug的时候花上大半天找错很不值得。要求细心但是不可能每一次都不犯错,这是很难做到的。其实用不上很久,我现在有很好的debug技巧😎

刚写完这篇文章,就在2887. Fill Missing Data宰了跟头。别问为什么,问就是把兄弟列也给填充了。笑死