我可以调用不带括号的 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]
.
这在 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)
第一次在这里发帖,如果我没有遵循格式指南或其他任何内容,请见谅。
我正在编写一个类似于终端的实用工具,用于批量文件编辑等。我的目标是让每个函数都是三个字母 ling,有点像 Assembly。例如,mkd("yeet")
创建一个名为 yeet 的目录。
它的基本工作方式如下:我定义了一大堆函数,然后我设置了一个 while True
循环,它打印出我键入的任何内容的 eval()
。
到目前为止,一切都很顺利,除了一件事。我希望能够在不添加括号的情况下调用函数。之后应添加任何参数,例如使用 sys.argscv[1]
.
这在 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)