别再乱玩 Python 黑魔法:这些骚操作,我真后悔在生产里用过
如果你写 Python 有一阵子了,大概率经历过这样的心路历程:
“哇,这个写法也太酷了吧!”
“好优雅,好简洁,好有逼格!”
几个月后回头看自己的代码:
“这谁写的?哦,是我……我当时脑子抽了。”
这篇文章,就是想和你聊聊那些常被称为 “Python 黑魔法” 的技巧——
哪些值得掌握,哪些只适合在 demo 里秀一秀,哪些一旦进了生产就会让你在深夜默默背锅。
文章既适合刚入门 Python 编程、好奇“骚操作”背后原理的同学,也适合已经在生产中写了几年 Python,希望提升代码质量、追求最佳实践的开发者。
我会用以下结构来展开,每一部分都给出:
- 真实的“黑魔法”写法
- 可能踩的坑 / 我或别人真实的“后悔现场”
- 更推荐的 实战写法(最佳实践)
一、什么叫“黑魔法”?为什么让人又爱又恨?
简单说,“黑魔法”就是那些:
- 语法上允许
- 功能上能跑
- 短期看起来很酷
- 但 长期维护成本极高、可读性很差、很难 debug
的写法。
典型特征:
- 大量滥用
*args/**kwargs - 动态修改类和对象(猴子补丁、元类乱飞)
- 过度依赖
eval/exec做动态行为 - 让读者一句话看不懂、一屏看不完
黑魔法 不是原罪。
很多 Python 高级特性背后都有合理应用场景,但关键在于:
用在对的地方,而不是用来显摆。
接下来我们按场景拆解,边“忏悔”,边给你可落地的替代方案。
二、黑魔法 #1:from xxx import * —— 命名空间的无声爆炸
你可能见过这样写:
# config.py
PI = 3.14
DEBUG = True
# main.py
from config import *
print(PI, DEBUG)
看起来很干净,写起来也顺手。但问题是:
- 命名空间被污染:到底这个
DEBUG是谁的?同文件里再定义一个DEBUG会怎样? - IDE、类型检查、静态分析工具都会变得难用。
- 一旦多模块之间互相
import *,调试就是噩梦。
更黑一点的版本是这样:
# plugins/__init__.py
from .auth import *
from .storage import *
from .payment import *
看起来像是在“统一导出接口”,实际上是把所有符号扔进了一个大池子。
最佳实践:显式导入 + __all__
推荐写法:
# config.py
PI = 3.14
DEBUG = True
__all__ = ["PI", "DEBUG"]
# main.py
from config import PI, DEBUG
# 或者:
import config
print(config.PI, config.DEBUG)
操作建议:
- 在 应用层代码(特别是生产项目)里,禁止使用
from xxx import * __init__.py中如果需要“集中暴露接口”,请配合__all__使用,并且只为真正需要对外暴露的库/SDK 这么做
三、黑魔法 #2:可变默认参数 —— Python 入坑经典
这可能是很多人接触的第一种“黑魔法”。
“它居然会记住上一次的值?”
def add_item(item, items=[]):
items.append(item)
return items
print(add_item(1)) # [1]
print(add_item(2)) # [1, 2]
print(add_item(3)) # [1, 2, 3]
很多初学者看到这个表现都会懵:
“我没传 items 啊,为什么会越来越长?”
原因:
默认参数在函数定义时只执行一次,items 绑定的是同一个 list 对象。
最佳实践:使用 None 作为哨兵值
def add_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
print(add_item(1)) # [1]
print(add_item(2)) # [2]
操作建议:
- 面试、带新人、写框架代码时,明确禁止使用可变对象(
list、dict、set等)作为默认参数 - 如果确实需要“共享状态”,显式使用类属性或闭包,避免“不经意间的魔法”
四、黑魔法 #3:eval / exec —— 动态执行的双刃剑
“一行代码搞定动态逻辑”的诱惑
def calc(expr: str) -> float:
return eval(expr)
print(calc("1 + 2 * 3")) # 7
print(calc("sum(range(10))")) # 45
看起来很强大,能执行任何动态表达式。
但问题也来了:它能执行任何东西。
如果用户输入是:
calc("__import__('os').system('rm -rf /')")
你就知道什么叫“真正的后悔”。
而且 exec 更狠,直接执行任

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



