为何Python非主文件脚本无需导入依赖模块?实操疑问
问题:未导入依赖模块的函数为何能正常调用第三方库方法?
我编写了Python脚本,使用DuckDB查询数据库,主文件main.py内容如下:
import duckdb import pandas as pd import utils.func con = duckdb.connect(database="db.duckdb", read_only=False) data = { "id": ["1","2","3","4","5","6",], "group": ["A","A","A","B","B","B",], "names": ["aze","www","ttt","xxxxxx","llllll","ggggggg",], } data_df = pd.DataFrame(data) con.execute("CREATE TABLE IF NOT EXISTS data AS SELECT * FROM data_df") my_query="select * from data" res = utils.func.query(con, my_query) print(res)
查询逻辑封装在utils/func.py的query函数中,内容如下:
def query(DB_connection, query): print('appel') result=DB_connection.execute(query).df() return result
我对此感到困惑:func.py中并未导入duckdb和pandas,但调用了DuckDB连接的execute()方法以及结果的df()方法,运行main.py时程序却正常工作。原以为func.py无法识别这些方法,请问是否仅需在主文件中导入模块即可?
解答
这是Python动态类型特性带来的结果,和模块导入范围无关,核心原因如下:
- 你在
main.py中创建的con是一个已经实例化完成的duckdb.DuckDBPyConnection对象,它自带所有该类定义的方法(包括execute()),这些方法已经绑定在对象本身,不需要额外的模块导入来激活。 - 当你把
con作为参数传递给func.py的query函数时,函数拿到的是一个完整、可用的对象,Python只检查这个对象有没有execute()方法,不关心这个方法的定义来自哪个模块,也不需要在func.py里导入duckdb。 - 同理,
execute()返回的结果集对象本身就实现了df()方法(用于转换为Pandas DataFrame),这个方法是DuckDB库为结果对象提供的,和func.py是否导入pandas完全无关——pandas只是DataFrame的类型定义,但转换动作是由DuckDB的对象完成的。
总结:Python是动态语言,函数不要求提前知道传入对象的类型,只需要确保传入的对象具备你要调用的方法即可。只要对象本身是合法的、拥有对应方法的实例,不管当前模块有没有导入该对象所属的库,代码都能正常运行。
内容的提问来源于stack exchange,提问作者Luc
相关产品推荐
相关产品推荐

