xonsh中同名别名与函数的冲突及函数转别名实现问询
解决xonsh中函数转别名后原函数仍可访问的问题
首先明确两个核心点:
- 别名优先级本来就高于Python函数:xonsh的命令查找顺序是先查别名字典
aliases,再查Python全局函数,所以只要别名和函数同名,输入名称时会优先执行别名,不需要额外配置优先级。 - 你原来的
del func无效的原因:func是函数内部的局部变量,删除它只是移除了这个局部引用,而原函数在全局命名空间的引用(比如你定义的myfunc)依然存在,所以原函数还能被访问到。
实现你想要的效果:转别名后移除原函数的全局引用
修改你的turn_into_alias函数,让它同时删除全局命名空间里的原函数:
def turn_into_alias(func, keep=False): func_name = func.__name__ # 将函数添加为别名 aliases[func_name] = func if not keep: # 从全局命名空间中移除原函数引用 globals().pop(func_name, None)
原理说明
globals().pop(func_name, None)会直接从全局命名空间中删除以函数名为键的条目,这样原函数就无法再通过全局名称访问了。- 如果你设置
keep=True,则会保留原函数的全局引用,只添加别名,满足灵活需求。
举个测试例子:
def hello(): print("Hello from function") turn_into_alias(hello) # 此时输入hello会执行别名(也就是原函数逻辑) hello # 尝试直接访问原函数会报错:NameError: name 'hello' is not defined globals().get('hello') # 返回None
这样就完全实现了“将函数转为别名,同时移除原函数可访问性”的需求。
内容的提问来源于stack exchange,提问作者saga
相关产品推荐
相关产品推荐

