我可以调用不带括号的 Python 函数,例如 shell 命令吗?如果是这样,如何?

Can I call a Python function without brackets, like a shell command. If so, how?

第一次在这里发帖,如果我没有遵循格式指南或其他任何内容,请见谅。

我正在编写一个类似于终端的实用工具,用于批量文件编辑等。我的目标是让每个函数都是三个字母 ling,有点像 Assembly。例如,mkd("yeet") 创建一个名为 yeet 的目录。
它的基本工作方式如下:我定义了一大堆函数,然后我设置了一个 while True 循环,它打印出我键入的任何内容的 eval()。 到目前为止,一切都很顺利,除了一件事。我希望能够在不添加括号的情况下调用函数。之后应添加任何参数,例如使用 sys.argscv[1].

这里是link to the GitHub repo.

这在 Python 中可行吗?如果可行,如何实现?

显然,只需输入函数名称 return 我 <function pwd at 0x7f6c4d86f6a8> 或类似的东西。

提前致谢,
海象橡胶靴

您可以根据范围使用 locals or globals 并传递您在参数中获得的字符串:

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

其中 "foo" 是调用 python script.py foo

sys.args[1]

或者您可以使用可用命令定义自己的字典,例如:

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

在 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()

click library is a library that i have used and in my opinion, perfect for creating commandline applications. Here is a youtube video 展示了如何创建示例应用程序。

Here 是网站对 click 如何不使用 argeparse 的解释。

不,这不可能。没有有效的语法

f 1 2

在 python 中。您需要一种支持它的语言(例如 Scala)或一种具有宏的语言(例如 lisp/clojure)

您可以做的最接近的事情是,例如,使函数成为可调用对象,重载二进制移位运算符,然后编写类似

的内容
f << 1, 2

这里有一个简单的例子,如果你想自己解析字符串,很容易扩展。

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)