Python自定义函数间传递MongoDB的mycol触发NameError未定义错误
解决函数间传递MongoDB集合对象导致的NameError问题
报错NameError: name 'mycol' is not defined的核心原因是change_db_data函数内部未获取到mycol集合对象——主函数中虽通过init_db成功获取了mycol,但调用change_db_data时并未将该对象传入函数,导致函数无法识别这个变量。
标准解决方案:通过参数传递集合对象
步骤1:修改change_db_data函数定义,添加mycol参数
更新Iser_upd_qur_del_function.py中的函数签名,将mycol作为第一个参数传入:
import pymongo import datetime import json def init_db(ip, db, coll): myclient = pymongo.MongoClient('mongodb://' + ip + '/') mydb = myclient[db] mycol = mydb[coll] return mydb, mycol def change_db_data(mycol, myquery_json, newvalues_json, one_or_many_bool): if one_or_many_bool == True: x = mycol.update_many(myquery_json, newvalues_json) else: x = mycol.update_one(myquery_json, newvalues_json) return x
步骤2:修改主函数调用,传入mycol对象
在main.py中调用change_db_data时,把获取到的mycol作为第一个参数传入:
from Iser_upd_qur_del_function import * ip_input = input("Enter the ip: ") exist_DB_name = input("Enter exist DB name: ") exist_coll_name = input("Enter exist collection name: ") mydb, mycol = init_db(ip_input, exist_DB_name, exist_coll_name) myquery_str = input("Enter ur query: ") update_one_or_many = input("U are update one or many values? (ex:1 for many , 0 for one): ") newvalues_str = input("Enter new values: ") one_or_many_bool = bool(int(update_one_or_many)) myquery_json =json.loads(myquery_str) newvalues_json =json.loads(newvalues_str) # 传入mycol参数 x = change_db_data(mycol, myquery_json, newvalues_json, one_or_many_bool) print(x) print(x.modified_count, "documents updated.")
可选方案(不推荐):使用全局变量
如果不想通过参数传递,可在init_db函数中将mycol设为全局变量,但这种方式会降低代码可维护性和复用性,仅适合简单脚本:
在Iser_upd_qur_del_function.py中修改init_db:
def init_db(ip, db, coll): global mycol myclient = pymongo.MongoClient('mongodb://' + ip + '/') mydb = myclient[db] mycol = mydb[coll] return mydb, mycol
此方案无需修改change_db_data的参数和主函数调用,但不建议在复杂项目中使用。
内容的提问来源于stack exchange,提问作者j ton
相关产品推荐
相关产品推荐

