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

fnds

Executar uma função antes do print

19 mensagens neste tópico

O meu problema é o seguinte, eu estou a criar um modulo e precisava que quando fosse efectuado um print (ou só o 1º) fosse executada uma função antes. É possível?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O meu problema é o seguinte, eu estou a criar um modulo e precisava que quando fosse efectuado um print (ou só o 1º) fosse executada uma função antes. É possível?

Chamares a função antes do print?!?

Sinceramente, não percebi bem a dúvida...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

def myprint(mystring):
    #o teu codigo aqui
    print mystring

Quanto a redifinires o comportamente de uma função built in no python, o meu conhecimento da linguagem não chega aí. É capaz de ser possível, não sei, tambem não estou a ver uma situação onde eu fosse usar isto, a não ser que fosse crackar um módulo compilado :cheesygrin: coisa que não tenho paciencia para fazer, ainda que considere interessante.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu estou a fazer um modulo (que quando acabar vai ser OpenSource) para facilitar o desenvolvimento de páginas web (CGI) em python. Estou a copiar a facilidade do PHP para o Python (as variaveis GET, POST, COOKIE, FILES, etc..) e precisava de saber quando era executado um print para espetar no servidor os headers. Estão a perceber?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Resumindo e complicando, nada te impede de usares outro nome que não 'print'.

Ou melhor até de criares uma classe para gerir o output. Assim podes fazer 1001 coisas interessantes, tipo gestão de headers, diferentes tipos de output consoante o tipo de dados a imprimir, e muito mais magia!

Eu aconselho-te a dares uma vista de olhos no equivalente em perl

http://perldoc.perl.org/CGI.html

Sempre podes tirar algumas ideias.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Usando o print, não estou a ver como o fazer. Podes é usar um print alternativo, e aí sim, podes fazer o que queres.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Fixe fixe era usando mesmo o print :P

Como crio esse print alternativo, dá para fazer uma cena do género?:

print_alternativo "python"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O print a partir da versão 3.0 vai ser uma função normal. Talvez seja boa ideia se começarem a habituar. :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O print a partir da versão 3.0 vai ser uma função normal. Talvez seja boa ideia se começarem a habituar. :P

Mesmo função?!, tipo vai ser possivel fazer print = outra_função_qualquer?
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pretty cool, uh? :D

Tentei fazer isso no 2.x, mas não deixou porque o print é considerado um language constructor, logo não pode ser alterado :P
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tive uma ideia, ir ás origens do print, o sys.stdout, se eu conseguir substituir o sys.stdout.write por outra função tenho o poblema resolvido :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não quero ser o cabeça dura que diz para fazeres isso de outra forma, mas qual é a grande vantagem usares o o nome 'print' em vez de uma coisa tipo CGI.out()?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Consegui! :P

Não dá para alterar a função sys.stdout.write (é read only)

>>> import sys
>>> sys.stdout.write = lambda:1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'file' object attribute 'write' is read-only

Então resolvi tentar reescrever a class, mas não estava a conseguir colocar no escorpo global da class todas as funções do sys.stdout.

Até que descobri este magnifico construtor (acho que é assim que se chama), que já me foi necessário noutros scripts, o __getattr__, quando é chamado um metodo que não existe na class esto função é executada.

Fica aqui a solução:

>>> class OutputControl:
         def __init__(self):
                 self.stdout_backup = sys.stdout
         def write(self, data):
                #O meu codigo aqui
                 self.stdout_backup.write(data)
         def __getattr__(self, attr):
                 return getattr(self.stdout_backup, attr)
>>> sys.stdout = OutputControl()
>>> print "Hello"
Hello

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu não quero ser o cabeça dura que diz para fazeres isso de outra forma, mas qual é a grande vantagem usares o o nome 'print' em vez de uma coisa tipo CGI.out()?

O objectivo deste modulo é ser simples, não ser necessário aprender nada para fazer um site, fazer do python um php :P
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mais fácil ainda seria fazer um If de qualquer coisa (não sei qual é o trabalho que ele está fazer por isso...) que faça print daquilo que ele quer e fazer a função a seguir. (Se bem percebi o que ele quer é que o programa execute uma ordem se fizer esse print)... Claro que a ordem de ideias não está bem correcta mas melhor mesmo só vendo o trabalho inteiro que ele fez. Claro que se fosse tão fácil ele chegaria lá mas como já disse teria que avaliar melhor o que ele quer e o programa feito...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

BlodyGrl, não percebi bem o teu post, mas o problema está resolvido :P.

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