变量改名
变量改名(Rename Variable)给一个变量换一个说明它用途的名字。
它解决的痛是:读代码的人要先推断 tmp、data、a 里装的是什么,推错了就写出错的代码。
一个销售报表函数,统计已付款订单的总额和各城市的金额。当初写得快,三个变量叫 a、tmp、data。
"""销售报表:改名前。"""
import json
def report(orders: list[dict]) -> tuple[float, dict[str, float]]: a = [o for o in orders if o["paid"]] tmp = sum(o["amount"] for o in a) data: dict[str, float] = {} for o in a: data[o["city"]] = data.get(o["city"], 0.0) + o["amount"] return tmp, data
ORDERS = [ {"city": "北京", "amount": 200.0, "paid": True}, {"city": "上海", "amount": 100.0, "paid": True}, {"city": "北京", "amount": 50.0, "paid": False},]
if __name__ == "__main__": print(json.dumps(report(ORDERS), ensure_ascii=False))
# 输出:# [300.0, {"北京": 200.0, "上海": 100.0}]// 销售报表:改名前。interface Order { city: string; amount: number; paid: boolean;}
export function report(orders: Order[]): [number, Record<string, number>] { const a = orders.filter((o) => o.paid); const tmp = a.reduce((s, o) => s + o.amount, 0); const data: Record<string, number> = {}; for (const o of a) { data[o.city] = (data[o.city] ?? 0) + o.amount; } return [tmp, data];}
const ORDERS: Order[] = [ { city: "北京", amount: 200, paid: true }, { city: "上海", amount: 100, paid: true }, { city: "北京", amount: 50, paid: false },];
console.log(JSON.stringify(report(ORDERS)));
// 输出:// [300,{"北京":200,"上海":100}]"""销售报表:改名后。"""
import json
def report(orders: list[dict]) -> tuple[float, dict[str, float]]: paid_orders = [order for order in orders if order["paid"]] paid_total = sum(order["amount"] for order in paid_orders) total_by_city: dict[str, float] = {} for order in paid_orders: total_by_city[order["city"]] = total_by_city.get(order["city"], 0.0) + order["amount"] return paid_total, total_by_city
ORDERS = [ {"city": "北京", "amount": 200.0, "paid": True}, {"city": "上海", "amount": 100.0, "paid": True}, {"city": "北京", "amount": 50.0, "paid": False},]
if __name__ == "__main__": print(json.dumps(report(ORDERS), ensure_ascii=False))
# 输出:# [300.0, {"北京": 200.0, "上海": 100.0}]// 销售报表:改名后。interface Order { city: string; amount: number; paid: boolean;}
export function report(orders: Order[]): [number, Record<string, number>] { const paidOrders = orders.filter((order) => order.paid); const paidTotal = paidOrders.reduce((sum, order) => sum + order.amount, 0); const totalByCity: Record<string, number> = {}; for (const order of paidOrders) { totalByCity[order.city] = (totalByCity[order.city] ?? 0) + order.amount; } return [paidTotal, totalByCity];}
const ORDERS: Order[] = [ { city: "北京", amount: 200, paid: true }, { city: "上海", amount: 100, paid: true }, { city: "北京", amount: 50, paid: false },];
console.log(JSON.stringify(report(ORDERS)));
// 输出:// [300,{"北京":200,"上海":100}]改名之后,不看函数名也能从变量名读出这个函数在做什么:筛出已付款的订单,算总额,按城市分。data 改成 total_by_city 之后,还顺带说明了字典的键是城市、值是金额。
定义与适用场景
Section titled “定义与适用场景”变量改名:把变量的名字改成能说明它用途的名字,并改掉所有引用它的地方。变量的作用域越大,名字越重要:函数里用三行就结束的循环变量叫 i 无妨,贯穿整个函数的变量叫 tmp 就会让每个读者都停下来猜。改名用 IDE 的 Rename 命令,它只改引用,不会误改字符串或注释里碰巧相同的文字(IDE 可自动完成)。改的是常量或模块级变量时,Rename 会一并改掉别的文件里的引用。
什么时候别用
Section titled “什么时候别用”短小的匿名函数和两三行的循环里,x、i 这种名字是惯例,改成长名字反而显得啰嗦。名字也不是越长越好,paid_orders 比 list_of_orders_that_have_been_paid 好。