Можно ли вызвать функцию Python без скобок, например, команду оболочки. Если так, то как? - PullRequest
1 голос
/ 17 апреля 2019

Первая публикация здесь, поэтому извиняюсь, если я не следую инструкциям по форматированию или что-то еще.

Я пишу утилиту, похожую на терминал, среди прочего, для массового редактирования файлов. Моя цель состояла в том, чтобы каждая функция состояла из трех букв, как в ассемблере. Например, mkd("yeet") создает каталог с именем yeet.
Основной способ, которым он работает, заключается в следующем: я определяю целый набор функций, а затем устанавливаю цикл while True, который печатает eval() того, что я набираю. Пока все идет хорошо, кроме одного. Я хочу иметь возможность вызывать функции без добавления скобок. Любые параметры должны быть добавлены позже, например, используя sys.argscv[1].

Вот ссылка на репозиторий GitHub .

Возможно ли это в Python, если да, то как?

Очевидно, что просто набрав имя функции, вы получите мне <function pwd at 0x7f6c4d86f6a8> или что-то в этом духе.

Заранее спасибо,
Моржовый сапог

Ответы [ 5 ]

3 голосов
/ 17 апреля 2019

Вы можете использовать locals или globals в зависимости от области видимости и передавать полученную строку в аргументах:

>>> def foo():
...     print("Hi from foo!")
... 
>>> locals()["foo"]()
Hi from foo!

Где "foo" будет sys.args[1] от звонка на python script.py foo

Или вы можете определить свой собственный словарь с помощью доступных команд, например:

calc.py

commands = {
    "add" : lambda x, y: x + y,
    "mul" : lambda x, y: x * y,
}

if __name__ == __main__:
    import sys
    _, command, arg1, arg2, *_ = sys.args
    f = commands.get(command, lambda *_: "Invalid command")
    res = f(int(arg1), int(arg2))
    print(res)

Звонок python calc.py add 5 10

0 голосов
/ 17 апреля 2019

Вот простой пример, если вы хотите разобрать строку самостоятельно, это легко расширяется.

def mkd(*args):
    if len(args) == 1:
        print("Making", *args)
    else:
        print("mdk only takes 1 argument.")

def pwd(*args):
    if len(args) == 0:
        print("You're here!")
    else:
        print("pwd doesn't take any arguments.")

def add(*args):
    if len(args) == 2:
        if args[0].isdigit() and args[1].isdigit(): 
            print("Result:", int(args[0]) + int(args[1]))
        else:
            print("Can only add two numbers!")
    else:
        print("add takes exactly 2 arguments.")

def exit(*args):
    quit()


functions = {'mkd': mkd, 'pwd': pwd, 'add': add, 'exit': exit}  # The available functions.  

while True:
    command, *arguments = input("> ").strip().split(' ')  # Take the user's input and split on spaces.
    if command not in functions:
        print("Couldn't find command", command)
    else:
        functions[command](*arguments)
0 голосов
/ 17 апреля 2019

Нет, это невозможно. Там нет действительный синтаксис, имеющий форму

f 1 2

в питоне. Вам нужен либо язык, который поддерживает это (например, Scala), либо язык с макросами (например, lisp / clojure)

Самое близкое, что вы можете сделать, это, например, сделать функцию вызываемым объектом, перегрузить двоичный оператор сдвига и написать что-то вроде

f << 1, 2
0 голосов
/ 17 апреля 2019

Библиотека click - это библиотека, которую я использовал и, на мой взгляд, идеально подходит для создания приложений командной строки. Вот видео на YouTube , показывающее, как создать пример приложения.

Здесь - это объяснение с сайта о том, как клик не использует argeparse.

0 голосов
/ 17 апреля 2019

В Python нет необходимости в скобках для вызова функции.

Возможно, вам покажется полезным модуль cmd - он предназначен для написания таких интерактивных инструментов командной строки, как выВы описываете, и у вас будет гораздо больше гибкости в отношении формата ввода.

Используя cmd, ваш инструмент может выглядеть следующим образом:

import cmd, os

class MyTerminalLikeUtilityTool(cmd.Cmd):

    def do_mkd(self, line):
        os.makedirs(line)

    def do_EOF(self, line):
        return True

if __name__ == '__main__':
    MyTerminalLikeUtilityTool().cmdloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...