【问题标题】:Implementing Switch with Python: 'null is not callable'用 Python 实现 Switch:'null is not callable'
【发布时间】:2014-10-15 08:52:35
【问题描述】:

我已经阅读了一些关于在 python 中实现 switch/case 的其他答案,我试图在我的代码中适应它但没有成功:

f = open(prg)

line = f.readline()  
splitting = line.split(" ", 1)
options = {"PUSH": push, "POP": pop, "ADD": add, "SUB": sub, 
           "MUL": mul, "DIV": div, "INPUT": inpt, "OUTPUT": outp,
           "EXIT": ext}
options[splitting[0]](splitting[1])

我将为字典中的每个元素实现一个函数。

问题在于 IDE 在options[splitting[0]](splitting[1]) 上说:“null is not callable”。

编辑:我一直在尝试几种方法来调用字典中的函数,但我发现了奇怪的行为: 这段代码:

    choice = "PUSH 1"
splitted = choice.split(" ", 1)
options = {"PUSH": push, "POP": pop, "ADD": add, "SUB": sub, "MUL": mul, "DIV": div, "INPUT": inpt, "OUTPUT": outp,
                "EXIT": ext}

options["PUSH"]

不正确,因为最后一条语句“无效”说 PyCharm。 但是,如果我将它包含在 try/catch 语句中,它就会消失,即使我执行以下操作也会消失:

options.get("PUSH", lambda: None)()

即使我知道如何选择正确的函数,我如何将参数传递给它们? 我很困惑。

【问题讨论】:

  • 该错误意味着splitting[0]实际上不在字典中。你能显示文件的内容(第一行)吗?
  • 尝试打印splitting[0]的值。
  • 只有 IDE 显示问题?你执行代码了吗?因为当我通过 shell 尝试它的工作时。
  • 嗨谢谢大家。我已经弄清楚了问题所在。问题是我还没有要测试的文件。我将尝试使用 line = 我会在文件中找到的东西,看看会发生什么。

标签: python switch-statement callable


【解决方案1】:

假设您的字典的值是函数。如果是这样,您必须在调用中添加括号:

options["PUSH"]()`

对于参数处理,我建议您将整个拆分列表传递给函数并在那里处理。

def push(splitted_list):
    param = splitted_list[1]
    #do something....

options = {"PUSH": push, "POP": pop, "ADD": add, "SUB": sub, "MUL": mul, "DIV": div, "INPUT": inpt, "OUTPUT": outp,
            "EXIT": ext}

choise = "PUSH 1"
splitted = choise.split(" ")
options[splitted[0]](splitted)

这将使用拆分列表调用推送函数,并对调用传递的参数执行一些操作。

【讨论】:

  • 你好丹尼尔。我要疯了。我已经为 python 2.7.8 运行了 PyCharm 社区版 3.4.1。语句 options[splitted[0]](splitted) 给出错误“null is not callable”。你的代码和这个简单的测试。 >>> def test(n): print n >>> test(5) 5 >>> d={'test':test} >>> d['test'](5) ---> 'NULL'不可调用我现在要为此打开一个线程。
  • @gargiulo2000,Daniel 的回答和你的“测试”对我来说适用于 WingIDE,所以看起来 PyCharm 有问题。
【解决方案2】:
(splitting[1])

是你的问题。

options[splitting[0]]

在你的'options'字典中返回一个条目,然后你使用“(splitting[1])”,注意你使用“()”,这取决于你从'options'返回的条目你可能可以使用“[]”。

试试这个:

    splitting = ['PUSH', 'POP', 'DIR']
    options = {"PUSH": 'push', "POP": 'pop', "ADD": 'add', "SUB": 'sub', 
               "MUL": 'mul', "DIV": 'div', "INPUT": 'inp', "OUTPUT": 'out',
               "EXIT": 'ext', "DIR": {'A': 'something'}}

    options[splitting[2]]
    options[splitting[2]]['A']

【讨论】:

  • 您好,感谢您的回复,但此代码不能满足我的需要。使用 (splitting[1]) 我希望在函数中传递参数。
  • 即使我不需要在字典中的键之后调用函数,在您的代码中,键上的调用也会向我显示错误:“语句似乎没有效果。”跨度>
猜你喜欢
  • 1970-01-01
  • 2022-08-23
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
  • 2021-10-22
  • 1970-01-01
  • 2018-07-23
相关资源
最近更新 更多