python3 exec not defined_Python3 NameError: name 'open' is not defined处理办法

一、说明

之前默认以为python的open方法用存哪里都没什么区别的,然后昨天直接在"__del__()"中使用今天同事跑程序时反馈程序报错“Python3 NameError: name 'open' is not defined”。

排查之后发现是在"__del__()"中使用open方法所致,处理办法是在别的地方打开文件保存成成员变量而不要在"__del__()"中使用open,原理则尚不太清楚。

二、程序示例

2.1 报错程序

报错代码如下:

class OpenTest():

def __init__(self):

pass

# 在del中使用open方法会报错

# 注意,除了下面演示的在del中直接使用open方法外,还包括del调用的函数中使用open方法的场景

def __del__(self):

file_obj = open("test.txt","w+", encoding="utf-8")

file_obj.writelines("test context\n")

file_obj.close()

if __name__ == "__main__":

obj = OpenTest()

报错截图如下:

2.2 不报错程序

代码如下:

class OpenTest():

def __init__(self):

# 也不一定要在init中打开,在del之外的地方打开都可以

self.file_obj = open("test.txt","w+", encoding="utf-8")

pass

# 在del中使用open方法会报错

# 注意,除了下面演示的在del中直接使用open方法外,还包括del调用的函数中使用open方法的场景

def __del__(self):

# file_obj = open("test.txt","w+", encoding="utf-8")

self.file_obj.writelines("test context\n")

self.file_obj.close()

if __name__ == "__main__":

obj = OpenTest()

随机推荐

Linux CentOS6.x ip设置(网卡设置)

修改IP永久生效按以下方法vi /etc/sysconfig/network-scripts/ifcfg-eth0(eth0,第一块网卡,如果是第二块则为eth1)按如下修改ip: DEVICE=et ...

mongodb certification

又偷懒 也有学到不少东西 这个东西算是小结啦 给2013年的碌碌无为挽回点面子 哈哈~

深入浅出 - Android系统移植与平台开发(五)- 定制手机模拟器ROM

一. 修改化定制Android4.0系统 Android系统启动时,先加载Linux内核,在Linux的framebuffer驱动里可以定制开 机界面,Linux内核启动成功后,挂载根文件系统,启动A ...

团队开发——冲刺1.d

冲刺阶段一(第四天) 1.昨天做了什么? 完成部分界面设置,补充三层难度界面.游戏结束界面. 2.今天准备做什么? 优化界面细节.查看C#资料,再解决自己电脑的问题. 3.遇到什么困难? 已经固定好的 ...

[Sinatra、Mongo] Mongo

Mongo is a document-oriented database. Install the required gems: gem install mongo gem install bson ...

【C#学习笔记】Hello World

using System; namespace ConsoleApplication { class Program { static void Main(string[] args) { Conso ...

WPF 得一些问题汇总

1.CallMethodAction

prime,素数的判断——c语言

输入一个数a,求他是否是素数(用函数) 程序: #include int prime(int a)-----------------------------------/ ...

HDU - 6080 :度度熊保护村庄 (凸包,floyd最小环)(VJ1900题达成)

pro:二维平面上,给定N个村庄.M个士兵驻守,把村庄围住,现在我们想留下更多的士兵休息,使得剩下的士兵任然满足围住村庄.N,M<500: sol:即是要找一个最小的环,环把村庄围住. 由于是环 ...

一个http请求发送到后端的详细过程

我们来看当我们在浏览器输入http://www.mycompany.com:8080/mydir/index.html,幕后所发生的一切. 首先http是一个应用层的协议,在这个层的协议,只是一种通讯 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值