Jump to content

Erro "TypeError str object is not callable"


Go to solution Solved by pwseo,

Recommended Posts

Posted (edited)

Boas, ja postei o meu problema em alguns sites mas ainda ninguem me soube dar resposta. Eu sou noob em python (geralmente programo em C ou C++) e andava aqui a mexer um bocado com ele para ver o que ele pode fazer. E então resolvi criar um pequeno script para basicamente calcular todas as combinações em um vector de 3 posições. O meu problema é que me dá esse erro ai em cima no titulo do tópico na linha 20 "Array[2] = string.uppercase(index)" e eu ainda não consegui perceber porque. Ja pesquisei e a conclusão que cheguei é que isso acontece quando definimos uma variavel que ja esta definida pelo python, mas no meu script não vejo esse problema. Quem me poder ajudar, fico desde ja agradecido e peço desculpa se o codigo nao estiver bem identado (mas penso que não havera esse problema).

#!/usr/bin/python2.7

import string

Array = ['A','A','A']

def Exp():

index = 0
count = 0

while Array[1]!=9:
    if Array[2]==9:
        Array[1] = string.uppercase(count)
        count = count + 1
        Array[2]='A'
        index = 0
    else:
        while Array[2]!=9:
            Array[2] = string.uppercase(index)
            index = index + 1
            if Array[2] == 'Z':
                Array[2] = 0
                while Array[2] < 9:
                    Array[2] = Array[2] + 1
print "done"

Exp()

Edited by pwseo
syntax highlight
Posted

Darkling,

Como podes ver na documentação de string, uppercase é uma string constante e não um método/função:

$ python2
>>> import string
>>> type(string.uppercase)
<type 'str'>

De resto, não verifiquei o teu código no que diz respeito à abordagem que estás a fazer à questão; vi apenas o problema relativo aos tipos de dados

Posted

Sim, eu sei, é uma string que contem as letras de A a Z certo? A ideia era que ele percorrese essa string incrementando o index. Eu tinha feito um outro script mais simples com python e funcionou bem desta forma...por isso é que eu não estou a perceber o problema.

Edit: Li outra vez o que disseste (desculpa, é do cansaço xD) e troquei os parenteses "()" por "[]". Ao fazer isso ele diz-me o seguinte:

" File ./combine.py", line 14, in Loligaging
   Array[1] = string.uppercase[count]
IndexError: string index out of range"

Eu tinha feito um script mais simples (como disse em cima) e não troquei os parenteses pelas chavetas e funcionou bem...dai também não estar a perceber o porque de agora estar a dar erro

  • Solution
Posted

Isso acontece porque algures no teu script a variável count assume valores que fogem aos limites da string.uppercase, como por exemplo o valor 26.

Uma pequena pergunta: estás a tentar criar um script que construa todas as combinações das letras do alfabeto com 3 posições? Se sim, por que não utilizar 3 ciclos?

Posted (edited)

Isso acontece porque algures no teu script a variável count assume valores que fogem aos limites da string.uppercase, como por exemplo o valor 26.

Uma pequena pergunta: estás a tentar criar um script que construa todas as combinações das letras do alfabeto com 3 posições? Se sim, por que não utilizar 3 ciclos?

Hmm..estou a ver..mas eu no script que tinha feito antes tinha ele feito percorrer o alfabeto (ou seja de A a Z, sendo entao de 0 a 25) da mesma forma e ele não tinha dado problema. A ideia era pegar nas ultimas duas posições (ou seja na 1 e 2) e fazer a terceira (2) avançar de A até Z..e depois avançar a mesma de 0 ate 9. Estanto isto feito avançava o A para B na segundo posição (ou seja na posição 1) e voltava a repetir o ciclo ate a segunda posição ser 9. Depois falta ainda a primeira posição mas essa ainda não fiz.

Edit: Esqueci-me de responder a tua pergunta xD. Por exemplo em C eu usaria ciclos for e depois usaria os if's para trocar para 0 e assim..mas no python..o for dele faz-me confusão xD...por causa do "in"..é algo que ainda estou a estudar xD...então resolvi fazer com while's

Edited by Darkling
Posted (edited)

Não seria mais simples criares uma string assim:

values = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

...e depois fazer os ciclos?

Exemplo:

values = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

for a in values:
   for b in values:
       for c in values:
           print('[{}, {}, {}]'.format(a, b, c))

E aqui ficaria o output:

$ python darkling.py
[A, A, A]
[A, A, B]
[A, A, C]
...
[A, A, 9]
[A, B, A]
[A, B, B]
...
[A, 9, 9]
[b, A, A]
[b, A, B]
...
[9, 9, 7]
[9, 9, 8]
[9, 9, 9]
Edited by pwseo
Adicionado (e editado) exemplo.
Posted

É eu custumo ter esse problema...geralmente vou sempre pelas alternativas mais dificeis xD..vou fazer assim obrigado 😄 ..mas ja agora, se souberes a explicação para isto não estar a dar como eu estava a fazer, partilha que eu estou sempre disposto a aprender 🙂

  • 2 months later...
Posted

Seguindo a documentacao:

string.uppercase

A string containing all the characters that are considered uppercase letters. On most systems this is the string 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'. The specific value is locale-dependent, and will be updated when locale.setlocale() is called.

string.upercase nao eh uma funcao e sim uma string equivalente a "ABCDEFGHIJKLMNOPQRSTUVWXYZ", explica o que estas a tentar fazer com esse codigo para que eu te possa ajudar 😄

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.