xonsh: конфликт между псевдонимом и функцией с тем же именем

Я определил эту функцию в моем xonshrc:

def turn_into_alias(func, keep=False):
    aliases[func.__name__] = func
    del func

Предполагается преобразовать функцию в псевдоним. Но это не работает. Это добавляет псевдоним все в порядке, кроме deleting не работает, потому что удаляет переданную ему ссылку на функцию.

Можно ли настроить xonsh так, чтобы он давал более высокий приоритет псевдонимам? (вероятно, нет, потому что в конце концов это Python:)

Есть ли способ добиться желаемого эффекта в xonsh?

1 ответ

В Python, и, следовательно, xonsh, del только изменяет текущую область. Итак, в вашем примере вы действительно просто удаляете имя func Внутри turn_into_alias(), Объект функции все еще может иметь ссылки на него в другом месте, поэтому Python не удалит его.

Поскольку это в вашем xonshrc, вероятно, самое простое, что нужно сделать, это удалить его из globals() или __xonsh_ctx__,

Что-то вроде следующего должно работать

def turn_into_alias(func, keep=False):
    name = func.__name__
    aliases[name] = func
    del globals()[name]

или же

def turn_into_alias(func, keep=False):
    name = func.__name__
    aliases[name] = func
    del __xonsh_ctx__[name]
Другие вопросы по тегам