Viquipèdia:Taller de bots 2010/Preguntes i respostes/Variables locals en definir funcions

  • He arribat al capítol Definint funcions. En l'exemple que comença:
    • Aquí tenim un exemple una mica més complex.
      • a_var = 10
      • b_var = 15
      • e_var = 25

no entenc la sortida de la primera instrucció


He afegit una explicació detallada del que succeeix pas a pas en executar-se el programa. Mira-ho a veure si ara s'entén. --Gomà (disc.) 21:27, 19 ago 2010 (CEST)[respon]
Molt bé gràcies. En el següent exemple (conversió °C a °F), en entrar la opció "c" (o qualsevol altra), em treu del programa.--Pallares (disc.) 09:50, 20 ago 2010 (CEST)[respon]
Podries explicar quin error et diu, o donar el codi font? --Joancreus (discussió) 10:09, 20 ago 2010 (CEST)[respon]
 Traceback (most recent call last)
  File "c:\python24\Lib\idlelib\hola.py", line 28, in ?
  choice= "input ("option: ")
  File "(String)", line 0, in ?
NameError: name 'c' is not defined

Tot això de dalt.--Pallares (disc.) 13:40, 20 ago 2010 (CEST)[respon]

Aprofito per fer una altra pregunta. En un fitxer .py on faig servir les ordes de substitució, com ara:

'replacements': [

(u"technique", u"tècnica")....

és possible una sustitució condicionada? Per exemple, vull substituir tot el que hi ha entre "<ref>" i "</ref>", però la llargada no és sempre la mateixa. Com fer-ho?--Pallares (disc.) 13:49, 20 ago 2010 (CEST)[respon]

Hola!,
Et responc les preguntes per separat:
  1. La causa del primer error és que has utilitzat input, quan s'ha de fer raw_input. Allò que aportis a input ha de ser sintàcticament vàlid, com per exemple nom_duna_funcio() o 'hello world'. Per tant, com que no has definit c, passa això. En canvi, raw_input et dóna un string, o cadena de text. Llavors pots entrar c sense haver de fer 'c'. Crec que s'hauria de canviar a viquillibres. Pots veure més informació aquí (input() i raw_input()), diu que input() = eval(raw_input('bla')). Si tens cap dubte torna-ho a preguntar.
  2. Això segon que dius no es pot fer amb un text.replace normal. Has d'utilitzar les expressions regulars (manual català o manual anglès). Per exemple,
# -*- coding: utf-8 -*-

import re

txt = 'blablablablabla<ref>ref-llibre autor desconegut</ref>continuaeltext'
txtnou = re.sub('<ref>.*</ref>','<ref>noutext</ref>',txt)
print txtnou

# llavors encara hi ha nivells més avançats!
# si vols afegir a dins de <ref> i </ref> el text que ja hi ha i un altre que et vingui de gust, pots fer...

txtnou2 = re.sub(r'<ref>(.*)</ref>',r'<ref>\1 text_afegit_pel_regexp</ref>',txt)
print txtnou2

# Els parèntesis "capturen" l'expressió regular que hi hagi a dins i després ho pots utilitzar en una altra banda. El primer parèntesi és \1, el segon \2, i així anar fent

# A part de .sub també n'hi ha de diversos: search, match, findall, finditer...
El resultat és
blablablablabla<ref>noutext</ref>continuaeltext
blablablablabla<ref>ref-llibre autor desconegut text_afegit_pel_regexp</ref>continuaeltext

No dubtis en preguntar si continues tenint dubtes. --Joancreus (discussió) 14:56, 20 ago 2010 (CEST)[respon]

Gràcies. Pel que fa al curs, amb les modificacions he passat la lliçó, corregint-ho en els tres exemples que quedaven de la pàgina , tal com comentaves.

Pel que fa a les substitucions, funciona en local. Com fer-ho per que "actui" en una pàgina?, per exemple la que tinc a Laboratori, que de moment no vull trencar res.--Pallares (disc.) 10:34, 23 ago 2010 (CEST)[respon]

Aquí hauries de crear ja un bot amb el wikipedia.py. Has d'agafar la pàgina, i el text, i llavors fer la substitució. Em sembla que l'amical no pot, però potser la pàgina d'expressions regulars sí. Comenta-li a en Gomà, jo no sé com funciona l'amical. En cas que no es pogués, hauries de fer una cosa del tipus:
import wikipedia
import re

def main():
    site = wikipedia.getSite('ca')
    page = wikipedia.Page(site,u'nom_de_la_pàgina')
    text = page.get()
    noutext = re.sub(regexp1,regexp2,text)
    page.put(noutext,comment=u'Bot fent canvis de ...')
Recorda que has d'haver fet el login.py. Si no et funciona, diga'm-ho i ho intentaré resoldre. --Joancreus (discussió) 18:51, 24 ago 2010 (CEST)[respon]