xonsh: Есть ли способ вызвать функцию в качестве команды, которая принимает необязательные аргументы?

#xonsh

Вопрос:

У меня есть функция в Xonsh, которую я пытаюсь использовать как команду (т. Е. Без родителей). При необходимости функция должна принимать аргументы, однако всякий раз, когда я вызываю функцию без аргументов, я просто получаю адрес функции. Как вызвать функцию с дополнительными параметрами?

Вот пример:

 def _up(args, stdin=None):
    # go up any number of directories
    if not args or len(args) < 1:
        args[0] = 1
    balloons = ('../' * int(args[0]))
    # echo @(balloons)
    cd @(balloons)
aliases['up'] = _up
 

Когда я звоню up без параметров, я получаю <function __main__.up> . Когда я называю это так, это работает: up 2 .

Я мог бы выполнить такую функцию, которая работает, но тогда я не смогу ее вызвать, не используя скобки (т. Е.: В качестве команды), что я бы предпочел:

 def up(dirs=1):
    # go up any number of directories
    balloons = ('../' * dirs)
    # echo @(balloons)
    cd @(balloons)
 

Вызов up() и up(2) то и другое работают таким образом, но это более обременительно, чем просто вызов up или up 2 . Как правильно сделать то, что я пытаюсь сделать в Ксоне?

Ответ №1:

Я не уверен, почему вы получаете функцию repr , когда не передаете аргумент, но исправленная версия вашей функции работает:

 def _up(args):  # don't need stdin
    # go up any number of directories
    if not args or len(args) < 1:
        args = [1]  # if args is None you can't index to it
    balloons = ('../' * int(args[0]))
    # echo @(balloons)
    cd @(balloons)
aliases['up'] = _up
 

в текущей main xonsh версии @ c2f862df это работает , чтобы подняться на один уровень с помощью всего одного up или вы можете указать много уровней up 3 и т. Д.

Комментарии:

1. Ах… комбинация ошибки в моем сценарии и того факта, что у меня была и функция, и псевдоним под названием «вверх» из-за борьбы с этим. При вызове без параметров он использовал функцию repr, при вызове с аргументами он использовал псевдоним. Таким образом, проблема, по-видимому, больше связана с моим ожиданием, что назначение псевдонима переопределит все остальное в области действия. Спасибо за помощь!