Python - TypeError:'function'类型的参数不可迭代

时间:2012-07-24 10:31:37

标签: python

我正在运行一些python代码并收到错误:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
    return self.func(*args)
  File "multiline14.py", line 28, in getText
    if encodinghex in process:
TypeError: argument of type 'function' is not iterable

我的def在下面。

def gui(item):
    def default_encode(s):
        pass

    # map items from menu to commands
    encodinghex = '.encode("hex")'
    decodinghex = '.decode("hex")'
    mapping = {"encode_b64": base64.encodestring,"encode_url": urllib.quote_plus,"encode_hex": encodinghex, "decode_b64": base64.decodestring, "decode_url": urllib.unquote_plus, "decode_hex": decodinghex}


    process = mapping.get(item, default_encode)

    def getText():
    #clear bottom text field
        bottomtext.delete(1.0, END)
    #var equals whats in middle
        var = middletext.get(1.0, 'end-1c')

    #insert encoded var in bottom
        if encodinghex in process:
            var = '"%s"' % (var)
            bottomtext.insert(INSERT, eval(var + process))
        elif decodinghex in process:
            var = '"%s"' % (var)
            bottomtext.insert(INSERT, eval(var + process))
        else:
            bottomtext.insert(INSERT, process(var))

导致该错误的原因是什么?

3 个答案:

答案 0 :(得分:1)

你所做的事情似乎没有任何意义。您有两个文本字符串,encodinghex和decodinghex,您正在使用eval转换为要执行的代码。但是在你的mapping词典中你还有各种各样的实际方法,你也试图传递给eval - 这本身就必然会失败,但在此之前你的代码就是试图将现有的文本字符串添加到实际的函数值,这是不可能的。

答案 1 :(得分:1)

您在此处mapping请求功能

process = mapping.get(item, default_encode)

然后尝试在此迭代:

if encodinghex in process:

除非主题为in,否则您无法使用Iterable关键字。

您在此尝试实现的是实际看到 哪个功能,您对mapping.get()的回复

if process == encodinghex:

请注意base64.encodestring, urllib.quote_plus, encodinghex, base64.decodestring, urllib.unquote_plus, decodinghex都是函数

答案 2 :(得分:0)

从您的示例的最后一行判断,您在某处有一个名为process()的函数。然而,您尝试访问它,就好像它是行if encodinghex in process中的可迭代一样。要修复错误,请更改函数或iterable的名称。