• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

joaoqalves

Erro na concatenação de uma string

12 mensagens neste tópico

Boa tarde pessoal, na minha saga de aprender python, mais uma dificuldade, desta vez prende-se nisto:

# Metodo erros, recebe o numero do erro e retorna o numero e respectiva mensagem

def errors(self,NumeroErro):
	Erro = 'Erro ' + str(NumeroErro) + ': '
	erros = {
				400 : Erro +='Solicitação incompriensível , protocolo inesistente , tipo incompatível',
				401 : Erro +='Não autorizado! Esta página requer autenticação',
				403 : Erro +='A solicitação foi recusada',
				404 : Erro +='Página não encontrada',
				405 : Erro +='Método não permitido',
				408 : Erro +='Excedeu o limite de tempo de espera',
				410 : Erro +='A página já não existe no servidor',
				500 : Erro +='Erro interno do servidor',
				501 : Erro +='A funcionalidade ainda não foi implementada',
				503 : Erro +='Serviço indisponível',
				505 : Erro +='Versão do protocolo HTTP não suportada',
			}

	print erros.get(NumeroErro,'lol')

A partir do Erro+=, o compilador dá erro ;), gostaria de saber o porquê. Já agora, deixo aí tudo  o que já fiz deste programa, para vocês verem se estou a seguir os "standards" ou se mudariam alguma coisa :D :

#-*-coding: ISO-8859-15 -*
import os, pycurl, sgmllib, StringIO, getpass
from sgmllib import SGMLParser

# Definicao da Classe

class Kiosk:

# Definicao de dados como o USER_AGENT, a pagina onde o login vai ser efectuado

reader = StringIO.StringIO()
user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0)'
pagina = 'http://ww2.ancorensis.pt/kioskwebnew/default.asp'

# Definicao do objecto Conn, que vai fazer todo o trabalho com o servidor: enviar e receber dados

Conn = pycurl.Curl()

# Funcao simples para limpar o ecra

def clrscr(self,linhas=100):

	if os.name == "posix":
		# No caso de serem sistemas *NIX based: Unix, Linux, MacOS, BSD
		os.system('clear')
	elif os.name in ("nt","dos","ce"):
		# No caso de serem sistemas DOS/Windows based
		os.system('CLS')
	else:
		# No caso de ser outro sistema operativo
		print '\n' * linhas


# Construtor da classe

def __init__(self): 
	NumCartao = input('\t Introduza o seu número de cartão:')
	Password = getpass.getpass('\n \t Introduza a sua password:')
	self.login(NumCartao,Password)

# Metodo login, recebe o numero do cartao do aluno e a respectiva password, para efectuar o login

def login(self,NumCartao,Password):
	self.Conn.setopt(pycurl.USERAGENT, self.user_agent)
	self.Conn.setopt(pycurl.FOLLOWLOCATION,1)
	self.Conn.setopt(pycurl.COOKIE,'Externo=N;ASPSESSIONIDQSQSRSAC=MNENNKHDDEOBJBGKGEKPEOIM')
	self.Conn.setopt(pycurl.URL, self.pagina)
	try:
		self.Conn.perform()
		self.clrscr()
	except:
		print "Erro: " + self.Conn.errstr()

	self.errors(self.Conn.getinfo(pycurl.HTTP_CODE))

# Metodo erros, recebe o numero do erro e retorna o numero e respectiva mensagem

def errors(self,NumeroErro):
	Erro = 'Erro ' + str(NumeroErro) + ': '
	erros = {
				400 : Erro +='Solicitação incompriensível , protocolo inesistente , tipo incompatível',
				401 : Erro +='Não autorizado! Esta página requer autenticação',
				403 : Erro +='A solicitação foi recusada',
				404 : Erro +='Página não encontrada',
				405 : Erro +='Método não permitido',
				408 : Erro +='Excedeu o limite de tempo de espera',
				410 : Erro +='A página já não existe no servidor',
				500 : Erro +='Erro interno do servidor',
				501 : Erro +='A funcionalidade ainda não foi implementada',
				503 : Erro +='Serviço indisponível',
				505 : Erro +='Versão do protocolo HTTP não suportada',
			}

	print erros.get(NumeroErro,'lol')

Cumps

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aconselho-te a ler um pouco sobre Python. Um dict não é um switch.

erros = {
404: 'Page Not Found',
500: 'Internal Server Error'
}
print erros[404]

Já agora, não é compilador, é interpretador.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Aconselho-te a ler um pouco sobre Python. Um dict não é um switch.

erros = {
404: 'Page Not Found',
500: 'Internal Server Error'
}
print erros[404]

Já agora, não é compilador, é interpretador.

O que li sobre python foi que a maneira de fazer um switch era com um dicionário :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes fazer algo equivalente a um switch com um dict sim, mas apenas para simular um:

switch(x){
    case 404:
        erro = "Page Not Found"
        break;
}
printf("%s\n", erro);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, tinhas uns quantos erros de português no teu código :(

Fica aqui a maneira mais correcta de fazeres isso que ai tínhas:

# coding: ISO-8859-15

def errors(NumeroErro):
    erros = {
			400 : 'Solicitação incompriensível , protocolo inesistente , tipo incompatível',
			401 : 'Não autorizado! Esta página requer autenticação',
			403 : 'A solicitação foi recusada',
			404 : 'Página não encontrada',
			405 : 'Método não permitido',
			408 : 'Excedeu o limite de tempo de espera',
			410 : 'A página já não existe no servidor',
			500 : 'Erro interno do servidor',
			501 : 'A funcionalidade ainda não foi implementada',
			503 : 'Serviço indisponível',
			505 : 'Versão do protocolo HTTP não suportada',
		}
    return 'Erro %s: %s' %(NumeroErro, erros[NumeroErro])

print errors(404)

Assim não tens que fazer errors.erros.get :) o return no fim da função faz essa tarefa sozinho. A formatação que tenho return também é algo a que te deves habituar, para evitar concatenações ilegíveis :(

Alguma dúvida, apita :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fiquei a pensar com o erro inicial.

Não seria antes possível ter um dicionário com funções?

Algo do género:

erros = {
   400 : (lambda x : x + 'Erro 400: Solicitação incompreensível , protocolo inexistente , tipo incompatível\n'),
   401 : (lambda x : x + 'Erro 401: Não autorizado! Esta página requer autenticação\n'),
...

Obviamente que neste caso só está a complicar, mas percebem qual é a ideia.

Não testei o código, mas penso que com funções lambda funcione, seria muito mau se não funcionasse. A questão é, existe forma de por funções sem ser funções lambda?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes criar o dicionário com uma função

numeros = (400, 401, 402, 403, 404)

def criaDic(dados):
    dic = {}
    for dado in dados:
        dic[dado] = dado*3
    return dic

print criaDic(numeros)

é só uma ideia, mas acho que não é bem o que tu pretendes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nops, não é bem isso. Seria algo mais tipo isto:

dic = { 'quadrado' : (lambda x : x * x), 'cubo' : (lambda x : x * x * x) }

fun = dic['cubo']

print fun(3)

Não sei se isto funciona, não tenho python aqui. Mas a ideia é essa, só que não estar restrito a funções lambda.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ninguém? Onde andam os mestres de python?

Mesmo se da maneira que disse não funcionar, gostava de saber se há uma alternativa para representar a mesma ideia.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso deve funcionar, mas acho que não é necessário e complica o que é simples. Anyway, se for para fazer uma rotinazita da forma que sugeres,

def f():
print "ois"
def g():
print "bye"

erros = {200: f, 500: g}
erros[erro]()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois como disse inicialmente, para este caso só complica, mas deixou-me a pensar.

Isto é algo que uso muitas vezes em certos casos, por exemplo, tens uma lista de elementos e queres filtra-los, mas só sabes os filtros que vais aplicar durante a execução. O que faço é por numa lista as funções de filtragem e depois quando for a altura de filtrar os elementos, para cada elemento aplico às funções, se o elemento falhar numa das funções então é filtrado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora