“O objeto de função não é subcriptável” no número inteiro básico para a função de mapeamento de string
Pergunta
Estou tentando escrever uma função para retornar a string do Word de qualquer número inferior a 1000.
Toda vez que eu executo meu código no prompt interativo, ele parece funcionar sem problemas, mas quando tento importar o Wordify e executá -lo com um número de teste superior a 20, ele falha como "objeto TypeError: 'function' não é substituível".
Com base na mensagem de erro, parece que o problema é quando ele tenta indexar NumString (por exemplo, tentando extrair o número 4 do caso de teste de n = 24) e o compilador acha que o número é uma função em vez de uma string. Como a primeira linha da função sou eu definindo o NumString como uma sequência da variável n, não sei por que isso é.
Qualquer ajuda para contornar esse erro, ou mesmo ajudar a explicar por que estou vendo, seria incrível.
def wordify(n):
# Convert n to a string to parse out ones, tens and hundreds later.
numString = str(n)
# N less than 20 is hard-coded.
if n < 21:
return numToWordMap(n)
# N between 21 and 99 parses ones and tens then concatenates.
elif n < 100:
onesNum = numString[-1]
ones = numToWordMap(int(onesNum))
tensNum = numString[-2]
tens = numToWordMap(int(tensNum)*10)
return tens+ones
else:
# TODO
pass
def numToWordMap(num):
mapping = {
0:"",
1:"one",
2:"two",
3:"three",
4:"four",
5:"five",
6:"six",
7:"seven",
8:"eight",
9:"nine",
10:"ten",
11:"eleven",
12:"twelve",
13:"thirteen",
14:"fourteen",
15:"fifteen",
16:"sixteen",
17:"seventeen",
18:"eighteen",
19:"nineteen",
20:"twenty",
30:"thirty",
40:"fourty",
50:"fifty",
60:"sixty",
70:"seventy",
80:"eighty",
90:"ninety",
100:"onehundred",
200:"twohundred",
300:"threehundred",
400:"fourhundred",
500:"fivehundred",
600:"sixhundred",
700:"sevenhundred",
800:"eighthundred",
900:"ninehundred",
}
return mapping[num]
if __name__ == '__main__':
pass
Solução
O erro significa que uma função foi usada onde deveria ter havido uma lista, como esta:
def foo(): pass
foo[3]
Você deve ter alterado algum código.
A propósito, wordify(40)
retornou "fourty"
. Eu soletra "forty"
E você não tem entrada para zero
Outras dicas
Caso alguém olhe aqui e tenha o mesmo problema que eu tive, você também pode obter um ponteiro para um objeto de função se o nome da variável errado for retornado. Por exemplo, se você tem função assim:
def foo():
my_return_val = 0
return return_val
my_val = foo()
Em seguida, o My_Val será um ponteiro para um objeto de função que é outra causa para o objeto "TypeError: 'function' não poderá ser submetido" se o my_val for tratado como uma lista ou matriz quando realmente é um objeto de função.
A solução? Simples! Corrija o nome da variável no foo que é retornado para my_return_val.