# 前言

 * [如何为变量起名](#如何为变量起名)
    - [1. 变量名要有描述性，不能太宽泛](#1-变量名要有描述性不能太宽泛)
    - [2. 变量名最好让人能猜出类型](#2-变量名最好让人能猜出类型)
        + [什么样的名字会被当成 bool 类型？](#什么样的名字会被当成bool类型)
        + [标题3.2](#标题3.2)
  * [标题4](#标题4)

# 如何为变量起名

编程时起的最多的名字，就是各种变量。

## 1. 变量名要有描述性，不能太宽泛

在**可接受的长度范围内**，变量名能把它所指向的内容描述的越精确越好。所以，尽量不要用那些过于宽泛的词来作为你的变量名：

+ **BAD**: `day`, `host`, `cards`, `temp`
+ **GOOD**: `day_of_week`, `hosts_to_reboot`, `expired_cards`

## 2. 变量名最好让人能猜出类型

不过，人们对于变量名和变量类型的关系，通常会有一些直觉上的约定，我把它们总结在了下面。

### 什么样的名字会被当成 bool 类型？

布尔类型变量的最大特点是：它只存在两个可能的值**「是」** 或 **「不是」**。所以，用 `is`、`has` 等非黑即白的词修饰的变量名，会是个不错的选择。原则就是：**让读到变量名的人觉得这个变量只会有「是」或「不是」两种值。**

下面是几个不错的示例：

+ `is_superuser`：「是否超级用户」，只会有两种值：是/不是
+ `has_error`：「有没有错误」，只会有两种值：有/没有
+ `allow_vip`：「是否允许 VIP」，只会有两种值：允许/不允许
+ `use_msgpack`：「是否使用 msgpack」，只会有两种值：使用/不使用
+ `debug`：「是否开启调试模式」，被当做 `bool` 主要是因为约定俗成

### 什么样的名字会被当成 int/float 类型？

人们看到和数字相关的名字，都会默认他们是 int/float 类型，下面这些是比较常见的：

+ 释义为数字的所有单词，比如：`port（端口号）`、`age（年龄）`、`radius（半径）` 等等
+ 使用 `_id` 结尾的单词，比如：`user_id`、`host_id`
+ 使用 `length/count` 开头或者结尾的单词，比如： `length_of_username`、`max_length`、`users_count`

**注意：**不要使用普通的复数来表示一个 `int` 类型变量，比如 `apples`、`trips`，最好用 `number_of_apples`、`trips_count` 来替代。

### 其他类型
对于 `str`、`list`、`tuple`、`dict` 这些复杂类型，很难有一个统一的规则让我们可以通过名字去猜测变量类型。比如 `headers`，既可能是一个头信息列表，也可能是包含头信息的 `dict`。
