震惊!(python)从其它文件import一个自定义的函数,运行结果却是这样!男默女泪,邻娃馋哭!!

在Python中,当从一个包含可执行语句的文件导入函数时,这些语句会在导入时执行。一个例子展示了如何避免这种意外行为,通过检查`__name__`属性来确保只有在模块作为主程序运行时才执行特定代码。

从另一个文件导入一个写好的函数,却因为这个小细节,造成了困扰

首先,新建两个.py文件。
filename: import_func_test.py,创建一个用来导入的函数:

def fun(x=1):
	print("我被执行了!", x)
	return x

print("测试一下函数")
fun()

filename: import_test.py,导入这个函数:

from import_func_test import fun

print("------")
print(fun(2))

运行import_test.py,结果是这样:

测试一下函数
我被执行了! 1
------
我被执行了! 2
2
[Finished in 0.2s]

w(゚Д゚)w

问题就出在import_func_test.py中多出来的:print语句和fun()函数调用

当初写import_func_test.py时,为了测试写好的函数,就直接调用这个函数测试了一下,后来也没有删掉,然后在其它文件中导入使用时,就发生了这个诡异的现象:在import阶段,import_func_test.py中的可执行语句先默认执行了一次。

如果将import_func_test.py中的print 、fun()放入if __name__ == "main":下:

def fun(x=1):
	print("我被执行了!", x)
	return x

if __name__ == "__main__":
	print("执行前先print一下")
	fun(5)

运行import_test.py,结果变成了这样:

------
我被执行了! 2
2
[Finished in 0.2s]

所以,在import_func_test.py中存在可执行语句、调用函数等情况下,当其它文件import这个文件/模块时,import过程会将模块先执行一遍,那么这些遗留的可执行语句、调用函数就会被运行一次。

安全的方法,就是使用这个:

if __name__ == "main":
    xxx
    xxx
    ...

name 是当前模块名,当模块被直接运行时模块名为 main
当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。

好尴尬~%?…,# *'☆&℃$︿★?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值