TypeError:'str'对象在python脚本中不可调用

时间:2017-04-21 18:26:43

标签: python arrays python-3.x for-loop if-statement

是的,我是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

我无法理解,哪里有错误?

5 个答案:

答案 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语句。