提问人:Luc 提问时间:11/16/2023 最后编辑:jpsLuc 更新时间:11/23/2023 访问量:68
为什么我不需要在不是主文件的脚本中导入模块?
Why don't I need to import modules in scripts which are not the main files?
问:
我有一个 python 脚本,想用 .
这是我 main.py 文件:duckdb
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)
正如你所看到的,我有一个函数来执行我的查询。 此函数有 2 个参数(与我的数据库的连接和查询)
这个函数写在另一个名为的文件中,我将其作为模块导入。func.py
以下是 func.py:
def query(DB_connection, query):
print('appel')
result=DB_connection.execute(query).df()
return result
在 中,我没有导入 ,也没有 .只有功能。
通过连接数据库,我使用方法 from 来执行我的查询。
然后我使用 pandas 的方法将结果转换为 DataFrame。func.py
duckdb
pandas
execute()
duckdb
df()
当我运行时,它可以工作,但我很惊讶,因为我认为它不应该工作,因为不应该知道如何使用该方法或方法。main.py
func.py
execute()
df()
这是否意味着我只需要在主文件中导入模块?
答:
如果我答对了你的问题,那么答案是肯定的,原因是你不需要把它导入到你的文件中,而是因为它已经在 main.py 中导入了
Python 它是一种非常奇怪的语言,有很多技巧,基本上解释器在模块中加载后保持导入的库可用。
也就是说,我不会中继这种行为,因为您的代码不会真正可重用(只有在调用方已经导入这些库时才有效),此外,由于缺少导入,某些 IDE 会显示错误。
因此,即使有效,最好将导入添加到您的 python 文件中。
评论
result=DB_connection.execute(query).df()
DB_connection
ececute
df
模块,或者更准确地说,函数不需要知道如何使用特定的方法,它只需要知道如何调用方法。它获取一个对象作为参数,并使用一个参数调用该对象的方法,该参数也作为参数进入该函数。然后发生的事情是对象的责任。无需知道该对象实际上是什么类型,只要它有一个按预期运行的方法并使用方法返回某些内容即可。func
query()
DB_connection
execute()
query
DB_connection
execute()
df()
如果某个方法不存在,你将获得该方法的 am。如果某个方法确实存在,但使用错误的参数调用,则该方法很可能会因此而遇到异常。AttributeError
对于给定给该模块中定义为参数的函数或方法的对象,模块无需了解更多。
以下是 Python 3.8 中该函数的反汇编字节码:
>>> dis.dis(query)
2 0 LOAD_GLOBAL 0 (print)
2 LOAD_CONST 1 ('appel')
4 CALL_FUNCTION 1
6 POP_TOP
3 8 LOAD_FAST 0 (DB_connection)
10 LOAD_METHOD 1 (execute)
12 LOAD_FAST 1 (query)
14 CALL_METHOD 1
16 LOAD_METHOD 2 (df)
18 CALL_METHOD 0
20 STORE_FAST 2 (result)
4 22 LOAD_FAST 2 (result)
24 RETURN_VALUE
第 3 行被编译为仅按名称调用方法。
评论