Python3如何实现可捕获函数异常返回None的赋值工具函数
Python 安全赋值工具函数实现方案
你设想的assign(x1, f1)调用形式无法直接实现,原因是Python的参数传递规则为「传对象引用」,你将外层x1变量作为参数传入函数时,仅传递了x1指向的对象的引用,函数内部修改形参的指向完全不会影响外层作用域的x1变量本身。
下面给出两种符合Python语法规则的可行实现方案:
方案1:返回值赋值(最推荐,无黑魔法)
这是最符合Python开发习惯、可读性和可维护性最高的方案,调整调用形式为直接接收工具函数的返回值即可。
工具函数实现
def safe_call(func, *args, **kwargs): try: # 执行传入的函数,支持传递任意位置参数和关键字参数 return func(*args, **kwargs) except Exception: # 捕获所有执行异常时返回None return None
调用示例
# 无参数函数 x1 = safe_call(f1) x2 = safe_call(f2) # 带参数的函数也支持直接传参 x3 = safe_call(f3, param1=1, param2="test")
方案2:通过命名空间赋值(适合全局变量批量赋值场景)
如果你需要尽量贴近你设想的调用形式,可以通过操作外层作用域的命名空间实现,需要传入变量名的字符串形式。
工具函数实现
def assign(var_name: str, func, scope: dict, *args, **kwargs): try: scope[var_name] = func(*args, **kwargs) except Exception: scope[var_name] = None
调用示例
# 全局变量场景,传入globals()作为作用域参数 assign('x1', f1, globals()) assign('x2', f2, globals())
注意:CPython解释器对局部变量做了优化,修改locals()返回的字典不会实际生效,该方案仅推荐用于全局变量的批量赋值场景
内容的提问来源于stack exchange,提问作者Vladimir Yanakiev
相关产品推荐
相关产品推荐

