str对象不可调用错误python

2024-04-25 13:53:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试用Python运行以下代码:

def likes(names):
    dictionary_of_sizes = {
        0:"no one likes this", 
        1:(lambda names: "{} likes this".format(names[0])),
        2:(lambda names: "{} and {} like this".format(names[0], names[1])),
        3:(lambda names: "{}, {} and {} like this".format(name[0], names[1],names[2])),
        4:(lambda names: "{}, {} and {} others like this".format(names[0], names[1], len(names)-2))
    }
    return dictionary_of_sizes[len(names)](names) if len(names)<4 else dictionary_of_sizes[4]

我总是得到错误'str'对象是不可调用的。你知道吗

问题:我做错了什么?你知道吗


Tags: andoflambdano代码formatdictionarylen
2条回答

您没有向我们显示引发异常的代码。当你不告诉我们你在做什么的时候,很难说你做错了什么。但如果我这么做,它似乎起作用了:

>>> likes(["John","Harry"])
'John and Harry like this'

我怀疑你可能是这样称呼likes()

>>> likes(["John","Harry"])()
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: 'str' object is not callable

或者像这样:

>>> likes("")
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "<input>", line 7, in likes
TypeError: 'str' object is not callable

你在如何调用函数方面遇到困难也就不足为奇了。代码对于它所做的事情来说是不必要的复杂。它需要彻底重写。如果要快速修复,请更改此行:

{0:"no one likes this", 

{0:(lambda names: "no one likes this"),

但是你真的应该放弃那些不必要的和难以阅读的lambda,做一些类似的事情:

def likes(names):
    if len(names) > 3:
        names = names[:2] + [f"{len(names)-2} others"]
    elif len(names) == 0:
        names = ["no-one"]
    result = " and ".join(", ".join(names).rsplit(", ",1))
    if len(names) == 1:
        return result + " likes this"
    else:
        return result + " like this"

如果您传递一个空字符串,它将写出错误消息。 您可以使用列表而不是字典:

def likes(names):
    options = ["no one likes this", 
                lambda names: "{} likes this".format(names[0]),
                lambda names: "{} and {} like this".format(names[0], names[1]),
                lambda names: "{}, {} and {} like this".format(name[0], names[1],names[2]),
                lambda names: "{}, {} and {} others like this".format(names[0], names[1], len(names)-2)
            ]
    if type(names) == list:
        return options[min(len(options),len(names))](names)

使用Python 3.6的f字符串:

def likes(names):
    options = [ lambda:"no one likes this", 
                lambda:f"{names[0]} likes this",
                lambda:f"{names[0]} and {names[1]} like this",
                lambda:f"{names[0]}, {names[1]} and {names[2]} like this",
                lambda:f"{names[0]}, {names[1]} and {len(names)-2} others like this"
            ]
    return options[min(len(options),len(names))]()


print(likes([]))
print(likes("bob"))
print(likes([""]))
print(likes(["alice","bob"]))
print(likes(["alice","bob","charlie"]))
print(likes(["alice","bob","charlie","david"]))

输出:

no one likes this
no one likes this
b, o and b like this
 likes this
alice and bob like this
alice, bob and charlie like this
alice, bob and 2 others like this

相关问题 更多 >