是的,我是Change conditions using loop and array in python
的作者所以,我试图改变这个条件:
if sys.argv[1] == 'add':
sys.exit(add(db, usr))
if sys.argv[1] == 'rem':
sys.exit(rem(db, usr))
if sys.argv[1] == 'rmusr':
sys.exit(rmusr(db, usr))
我正在尝试使用循环
更改列表中的这些条件从其他开发者的答案中,我使用了这个:
actions = ['add','rem','rmusr']
if sys.argv[1] in actions:
sys.exit(sys.argv[1](db, usr))
但是,当我试图检查它的功能时,我有这个
File "sql.py", line 25, in <module>
sys.exit(sys.argv[1](db, usr))
TypeError: 'str' object is not callable
我无法理解,哪里有错误?
答案 0 :(得分:1)
您的错误具体是因为您尝试使用签名字符串(db,usr)调用方法。 sys.argv [1]行是指位于程序 sys中列表 argv中的字符串。字符串不可调用;你的代码相当于:
"add"(db, usr) # add is not a variable name.
另一个问题的答案使用了一个字典,其查找键与同名的特定方法相关联,所以他们没有调用字符串,而是使用字符串从字典中查找方法。
答案 1 :(得分:0)
为了调用sys.argv[1]
命名的函数,需要先获取它。例如:
def add(x,y):
return x + y
def mul(x,y):
return x * y
def perform(action, x, y):
# action is a string containing a function name ("add" or "mul").
# globals() contains the accessible members, along with the functions.
return globals()[action](x, y)
在原始代码的上下文中:
actions = ['add','rem','rmusr']
if sys.argv[1] in actions:
func = globals()[sys.argv[1]]
sys.exit(func(db, usr))
答案 2 :(得分:0)
您可以使用以下内容:
# specify the function to call for each command:
# (note: the lookup key is a string, but the value is a function reference)
actions = {'add': add, 'rem': rem, 'rmusr': rmusr}
cmd = sys.argv[1]
# check if it's in the dictionary's keys
if cmd in actions:
# lookup the function to call
func = actions[cmd]
# call the function
sys.exit(func(db, usr))
或者这不那么冗长,但也不那么具体。它使用了globals()
字典中按名称列出所有已定义函数的事实。
# list of all allowed commands:
actions = ['add', 'rem', 'rmusr']
cmd = sys.argv[1]
# check if it's allowed
if cmd in actions:
# lookup the function by name in the globals() dictionary
func = globals()[cmd]
# call the function
sys.exit(func(db, usr))
答案 3 :(得分:0)
sys.argv[1]
的类型为str
(一个字符串),字符串不是一个函数。因此,当您尝试执行sys.argv[1](db, usr)
时,您实际上是在尝试执行一个字符串,就好像它是一个函数一样,这是不允许的。
可以做的是使用sys.argv[1]
中的值来查找函数。你可以通过多种方式做到这一点一种方法是使用globals()
查找函数,python myScript.py argument1
返回映射到实际函数本身的函数名称的字典。
例如:
假设您使用此命令执行程序:sys.argv[1]
。这意味着"argument1"
的值为globals()
。然后你将获取这个值并在locals()
返回的字典中查找该函数(或者如果你与你正在调用的函数在同一范围内,你可以使用sys.exit(globals()[sys.argv[1]](db, usr))
):
actions = {'add': add, 'rem': rem, 'rmusr': rmusr}
if sys.argv[1] in actions:
sys.exit(actions[sys.argv[1]](db, usr))
另一种方法是自己创建这个词典:
flatMap
答案 4 :(得分:0)
我更喜欢使用:https://docs.python.org/3.3/library/argparse.html 使用argparse,您可以使用命令行args获得morze灵活性。如果在命令行中使用了arg,则可以轻松使用if语句。