“O objeto de função não é subcriptável” no número inteiro básico para a função de mapeamento de string

StackOverflow https://stackoverflow.com/questions/3033563

  •  27-09-2019
  •  | 
  •  

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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top