Что делает `python3 ()`? - PullRequest
       6

Что делает `python3 ()`?

1 голос
/ 14 апреля 2020

При попытке выполнить команду timeit в командной строке с использованием интерфейса командной строки python я случайно поместил .function() на внешней стороне команды, например, так:

$ python3 -m timeit '<code>'.function()

Вместо При выполнении команды timeit мне было предложено следующее:

function>

Думая, что я вошел в реплан python, который я пытался завершить с помощью q. Да, я знаю, quit() - правильный способ сделать это. Вернувшись в командную строку, я заметил ошибку и исправил ее так:

$ python3 -m timeit `<code>.function()`

Я ожидал, что этот код будет выполняться правильно, но вместо этого я получил следующую ошибку:

python3:7: command not found: q

После обсуждения этого с некоторыми коллегами мне предложили проверить, какой python использовался:

$ which python3
python3 () {
    q
}

Это не то, что я ожидал! Обычно результат будет /usr/local/bin/python3. Путем проб и ошибок я смог определить, что минимальный случай, чтобы воспроизвести это:

$ python3 ()
function> q
$ 

Теперь, когда контекст отсутствует, у меня есть два вопроса о поведении, которое я засвидетельствовал: 1. Что именно делает python3 ()? 2. Как мне вернуть выполнение в исходное состояние в том же окне терминала? Я знаю, что могу открыть новое окно терминала, и в этом окне существует исходное состояние.

1 Ответ

4 голосов
/ 14 апреля 2020

Синтаксис foo () используется в POSIX-совместимых оболочках (таких как bash, da sh и zsh) для определения функции. Весь ваш фрагмент определяет функцию с именем python3 и выполняет команду q при запуске. Вы можете обойти функции оболочки и псевдонимы, используя команду command: command -p python3 myfile.py

Чтобы удалить функцию из текущего процесса оболочки, вы можете использовать unset -f python3. Если он продолжает возвращаться после запуска новых оболочек, то он, вероятно, определен в одном из файлов инициализации оболочки.

...