我可以调用无括号的Python函数吗,例如shell命令。如果是这样,怎么办?

时间:2019-04-17 10:36:18

标签: python function terminal terminal-emulator

第一次在这里发布,如果我不遵循格式指南或其他任何内容,因此深表歉意。

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

这里是link to the GitHub repo

在Python中是否可行?

很显然,仅键入函数名称将返回<function pwd at 0x7f6c4d86f6a8>或类似内容。

先谢谢了,
海象胶靴

5 个答案:

答案 0 :(得分:3)

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

>>> 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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

click library是我使用的一个库,我认为它非常适合创建命令行应用程序。这是youtube video,显示了如何创建示例应用程序。

Here是网站上有关点击如何不使用argeparse的解释。

答案 3 :(得分:0)

否,不可能。没有具有以下格式的有效语法

    JCasC:
      enabled: true
      PluginVersion: 1.11
      SupportPluginVersion: 1.11
      ConfigScripts:
        welcome-message: |
          jenkins:
            systemMessage: Welcome to our CI\CD server.  This Jenkins is configured and managed 'as code'.
        github-oauth: |
          jenkins:
            securityRealm:
              github:
                githubWebUri: "https://github.com"
                githubApiUri: "https://api.github.com"
                clientID: "<some-id>"
                clientSecret: "<some-secret>"
                oauthScopes: "read:org,user:email,repo"
        github-org-lock: |
          jenkins:
            authorizationStrategy:
              globalMatrix:
                grantedPermissions:
                  - "Overall/Administer:<some-org>"

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

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

f 1 2

答案 4 :(得分:0)

这是一个简单的示例,如果您想自己解析字符串,则很容易扩展。

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)