如何在模块中存储依赖其他模块的函数?导入最佳实践咨询
问题描述
我在独立模块funcs.py中编写了依赖pandas和datetime的parse_date函数,希望导入到main.py中使用:
def parse_date(date): # if value is null if pd.isnull(date) == True: # return 'UNDEFINED' return 'UNDEFINED' # else else: # for each format: 'mm/dd/yyyy', 'mm/dd/yy', 'mm-dd-yyy', 'mm-dd-yy', 'yyyy/mm/dd', 'yyyy-mm-dd', 'yyyymmdd' for fmt in ['%m/%d/%Y', '%m/%d/%y', '%m-%d-%Y', '%m-%d-%y', '%Y/%m/%d', '%Y-%m-%d', '%Y%m%d']: # try try: # return a date return datetime.strptime(date, fmt) # when error except: # move on to next date format pass raise ValueError('no valid date format found')
该函数依赖pandas和datetime库,我的main.py中也需要大量使用这两个库,目前已在文件顶部做了如下导入:
import os import pandas as pd import re import glob import time from datetime import datetime from seqfuncs import *
我想知道:
- 无需重复导入的前提下,导入
funcs.py及依赖库的正确方式 - 在
funcs.py顶部导入依赖和在函数内部导入两种方式,哪种是最佳实践 - 即使存在重复导入,
main.py顶部的导入语句是否需要保留
最佳实践解答
1. funcs.py采用模块级导入(顶部导入依赖)是最优选择
直接在funcs.py的顶部声明依赖导入,这是Python社区的通用规范,理由如下:
- 可读性更强:任何人打开模块就能一眼看到依赖的外部库,便于后续维护
- 性能更优:模块级导入只会在模块第一次被加载时执行一次,而函数内导入每次调用函数都会执行导入检查,存在额外开销
- 符合模块化原则:每个模块明确声明自己的依赖,职责边界清晰
修改后的funcs.py代码:
import pandas as pd from datetime import datetime def parse_date(date): if pd.isnull(date): return 'UNDEFINED' for fmt in ['%m/%d/%Y', '%m/%d/%y', '%m-%d-%Y', '%m-%d-%y', '%Y/%m/%d', '%Y-%m-%d', '%Y%m%d']: try: return datetime.strptime(date, fmt) except: pass raise ValueError('no valid date format found')
2. main.py的导入无需刻意“避免重复”,但建议优化导入方式
- Python的模块导入机制自带缓存,重复导入不会重复执行模块代码,
main.py里的import pandas as pd和funcs.py里的导入互不冲突,各自服务于当前模块的代码需求。因为你需要在main.py中大量使用pandas和datetime,所以必须保留这些导入语句。 - 建议把
from seqfuncs import *改为显式导入指定函数,比如from seqfuncs import parse_date,这样可以避免命名冲突,同时让代码更清晰,明确知道从外部模块引入了哪些内容。
3. 函数内导入的适用场景
你查到的“依赖未在其他地方使用时在函数内导入”是正确的,但只适用于特定场景:
- 依赖的库体积极大,且该函数很少被调用(避免拖慢模块加载速度)
- 存在循环导入问题(A模块导入B,B模块导入A)
显然你的场景不符合以上情况,所以没必要用函数内导入。
内容的提问来源于stack exchange,提问作者Cory
相关产品推荐
相关产品推荐

