You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:43:38