abonnement Unibet Coolblue Bitvavo
  zondag 22 juni 2008 @ 12:06:35 #51
19840 Libris
Live from Singapore
pi_59599971
Heb je wat code?

Tevens Schopje
pi_59601418
Het is officieel: Python is kut.

Ik was net heel even aan het spelen met dit stukje code: Wat devven we vandaag? Deel 2
Gewoon een copy/paste, en toen wilde ik even een regeltje toevoegen. Kreeg ik deze foutmelding:

1IndentationError: unindent does not match any outer indentation level


Probleem was dus dat de indents in de code uit 4 spaties bestonden, en de indent die mijn editor toevoegde uit een tab bestond, die toevallig hetzelfde eruitziet als 4 spaties. En daar verslikt python zich blijkbaar al in. :r

Ik heb die indentation die bepalend is voor syntax en werking van je programma altijd al een Slecht Idee gevonden en nu weet ik het zeker. Ik zie de problemen al voor me als je met meerdere mensen en verschillende editors aan dezelfde code werkt, wat een nachtmerrie gaat dat worden. Voor mij geen python, er is voor mij sowieso geen reden om daar tijd aan te verliezen, ik hou het wel gewoon bij perl. Veel beter.
pi_59611217
Moet zeggen dat ik wel onder de indruk ben van python. Vind het wel een prettige taal om in te proggen (lekkerder dan PHP bijv.). De indentation is vooral in het begin wennen, maar dat is een kwestie van tijd.

Als je met python werkt weet je dat je indentation cruciaal is voor de uitvoer en moet je gewoon een goede editor pakken zodat je je geen zorgen hoeft te maken over het editten van .py files.. Ik heb er zelf geen problemen mee gehad, wellicht omdat mijn tab/shiftwidth onder vim hetzelfde zijn als Python voorschrijft. Geen problemen mee dus.
In de interactieve python shell vind ik het bij vlagen irritant.

Python
  maandag 23 juni 2008 @ 13:40:00 #54
19840 Libris
Live from Singapore
pi_59624774
quote:
Op zondag 22 juni 2008 21:23 schreef slakkie het volgende:
Moet zeggen dat ik wel onder de indruk ben van python. Vind het wel een prettige taal om in te proggen (lekkerder dan PHP bijv.). De indentation is vooral in het begin wennen, maar dat is een kwestie van tijd.

Als je met python werkt weet je dat je indentation cruciaal is voor de uitvoer en moet je gewoon een goede editor pakken zodat je je geen zorgen hoeft te maken over het editten van .py files.. Ik heb er zelf geen problemen mee gehad, wellicht omdat mijn tab/shiftwidth onder vim hetzelfde zijn als Python voorschrijft. Geen problemen mee dus.
In de interactieve python shell vind ik het bij vlagen irritant.

[ afbeelding ] Python [ afbeelding ]
Ik heb collega's die die shell vaak gebruiken, ik kan er ook niet mee werken. Ik snap niet wat de voordelen zijn ten opzichte can een normale editor (zoals Eclipse), of zelfs notepad.
  maandag 23 juni 2008 @ 13:59:52 #55
147503 Iblis
aequat omnis cinis
pi_59625242
quote:
Op zondag 22 juni 2008 13:00 schreef Farenji het volgende:
Probleem was dus dat de indents in de code uit 4 spaties bestonden, en de indent die mijn editor toevoegde uit een tab bestond, die toevallig hetzelfde eruitziet als 4 spaties. En daar verslikt python zich blijkbaar al in.
Of 8 spaties. Dat hangt van je editor af. Of twee spaties. Of 3. Onder Unix is de standaard 8 spaties. Het wordt sterk afgeraden om spaties en tabs door elkaar te gebruiken, en dat geldt niet alleen voor Python (waar het errors geeft) maar ook voor C of Perl. Als jij je file netjes hebt opgemaakt, met 8 spaties voor een tab en omgekeerd, maar de tabs en spaties door elkaar gebruikt dan krijgt iemand anders die het bestand opent een chaos te zien. Kortom, een editor die spaties en tabs zo door elkaar gebruikt is een Slecht Idee.

Pythons manual zegt dan ook:
quote:
Cross-platform compatibility note: because of the nature of text editors on non-UNIX platforms, it is unwise to use a mixture of spaces and tabs for the indentation in a single source file. It should also be noted that different platforms may explicitly limit the maximum indentation level.
quote:
Ik heb die indentation die bepalend is voor syntax en werking van je programma altijd al een Slecht Idee gevonden en nu weet ik het zeker. Ik zie de problemen al voor me als je met meerdere mensen en verschillende editors aan dezelfde code werkt, wat een nachtmerrie gaat dat worden. Voor mij geen python, er is voor mij sowieso geen reden om daar tijd aan te verliezen, ik hou het wel gewoon bij perl. Veel beter.
Zoals gezegd, je krijgt dezelfde problemen in willekeurig welke taal als het om onderhoud van je source gaat. Als je met een groep samenwerkt en er wordt geen afspraak gemaakt over tab/spaties dan krijg je, ongeacht welke taal je gebruikt, ontzettend lelijke source-code doordat vroeg of laat iemand spaties door tabs gaat vervangen of omgekeerd.
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
  maandag 23 juni 2008 @ 14:02:59 #56
187069 slacker_nl
Sicko pur sang
pi_59625333
quote:
Op maandag 23 juni 2008 13:40 schreef Libris het volgende:

[..]

Ik heb collega's die die shell vaak gebruiken, ik kan er ook niet mee werken. Ik snap niet wat de voordelen zijn ten opzichte can een normale editor (zoals Eclipse), of zelfs notepad.
Voordeel is dat je snel een functie kan prototypen enzo. ff kijken of dit en dit zo werkt. heb hem zelf altijd open om help(func) of dir(var) te doen.
In theory there is no difference between theory and practice. In practice there is.
  maandag 23 juni 2008 @ 14:04:39 #57
147503 Iblis
aequat omnis cinis
pi_59625368
quote:
Op maandag 23 juni 2008 13:40 schreef Libris het volgende:
Ik heb collega's die die shell vaak gebruiken, ik kan er ook niet mee werken. Ik snap niet wat de voordelen zijn ten opzichte can een normale editor (zoals Eclipse), of zelfs notepad.
De Python-shell of vi? De Pythonshell heeft als voordeel dat je snel wat constructies kunt uittesten om te zien of ze werken, of je laadt een module, en je kunt met tab-completion (dat heeft de shell) even de attributen opzoeken, en snel een regeltje of constructie testen. Ik heb meestal wel een python shell open om snel iets uit te zoeken.

En wat vi betreft… dat blijft simpelweg een voorkeur, een editor als vi is heel krachtig als je ermee om kunt gaan (veel krachtiger dan Notepad bijvoorbeeld).
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
  dinsdag 24 juni 2008 @ 18:18:49 #58
73006 PaRaR
Geboren en getogen
pi_59656838
quote:
Op zondag 22 juni 2008 12:06 schreef Libris het volgende:
Heb je wat code?

Tevens Schopje
Uiteraard:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
allmatches = set()
   conn = MySQLdb.connect("localhost", "root", "", "espn")
   cs = conn.cursor()
   cs.execute("SELECT match_id FROM all_match WHERE league = '%s'" % (league))
   row = cs.fetchone()
   while row != None:
      allmatches.add(row[0])
      row = cs.fetchone()

   allsql = []


conn = MySQLdb.connect("localhost", "root", "", "espn")
   cs = conn.cursor()
   for sql in allsql:
      cs.execute(sql)
   conn.close()


Dit is het stukje dat de informatie die ik krijg in m'n DB moet zetten. Uiteraard heb ik user en wachtwoord even weggehaald. Als ik het script run dan krijg ik hier geen fouten mee. Dus hij connect wel. Hij schrijft alleen niks weg. Ik ben er nog steeds niet achter wat het nou is. Heeft iemand nog slimme tips om te kijken tot hoever de uitvoer van de sql gegevens komt o.i.d. ?

Alvast bedankt mensen
  dinsdag 24 juni 2008 @ 18:24:54 #59
147503 Iblis
aequat omnis cinis
pi_59656929
quote:
Op dinsdag 24 juni 2008 18:18 schreef PaRaR het volgende:
Uiteraard:
[ code verwijderd ]

Dit is het stukje dat de informatie die ik krijg in m'n DB moet zetten. Uiteraard heb ik root en wachtwoord even weggehaald. Als ik het script run dan krijg ik hier geen fouten mee. Dus hij connect wel. Hij schrijft alleen niks weg. Ik ben er nog steeds niet achter wat het nou is. Heeft iemand nog slimme tips om te kijken tot hoever de uitvoer van de sql gegevens komt o.i.d. ?

Alvast bedankt mensen
Hoe bedoel je wegschrijven? Je zou in de loop een print kunnen zetten. Dan kun je zien hoe vaak het daar doorheen komt. Ook kun je b.v. de boel in een script zetten tot row = cs.fetchone() en dan met python -i het script draaien, waarna je de boel kunt inspecteren in de shell (kun je kijken wat row is,etc.)

Overigens is ‘while row:’ beter Python-idioom dan ‘while row != None’.
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
  dinsdag 24 juni 2008 @ 19:15:27 #60
187069 slacker_nl
Sicko pur sang
pi_59657858
Kan je niet beter while row = cs.fetchone(): doen?
In theory there is no difference between theory and practice. In practice there is.
  dinsdag 24 juni 2008 @ 19:36:30 #61
147503 Iblis
aequat omnis cinis
pi_59658301
quote:
Op dinsdag 24 juni 2008 19:15 schreef slacker_nl het volgende:
Kan je niet beter while row = cs.fetchone(): doen?
Nee, dat is C-idioom en werkt expres niet in Python. Het geeft een syntax error. Je kunt geen toekenning binnen een conditie doen. De reden hiervoor is dat het ten eerste een beetje obscuur is, en ten tweede vaak de bug if (x = 3) vangt terwijl je (x == 3) wilde doen. Het staat ook in de FAQ
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
  dinsdag 24 juni 2008 @ 19:49:13 #62
187069 slacker_nl
Sicko pur sang
pi_59658584
Dan zou ik het zo doen:

1
2
3
4
while True:
    row = cs.fetchone()
    if row == None: break
    # do stuff


Ik vind die row = fetchone, en de while loop met de fetchone erin lelijk staan.
In theory there is no difference between theory and practice. In practice there is.
  woensdag 25 juni 2008 @ 19:21:28 #63
73006 PaRaR
Geboren en getogen
pi_59683602
quote:
Op dinsdag 24 juni 2008 18:24 schreef Iblis het volgende:

[..]

Hoe bedoel je wegschrijven? Je zou in de loop een print kunnen zetten. Dan kun je zien hoe vaak het daar doorheen komt. Ook kun je b.v. de boel in een script zetten tot row = cs.fetchone() en dan met python -i het script draaien, waarna je de boel kunt inspecteren in de shell (kun je kijken wat row is,etc.)

Overigens is ‘while row:’ beter Python-idioom dan ‘while row != None’.
Met wegschrijven bedoel ik het INSERT-en in m'n tabel. De rest van je tips ga ik nu uitproberen.
  maandag 18 augustus 2008 @ 11:51:20 #64
187069 slacker_nl
Sicko pur sang
pi_60919562
Iemand bekend met happydoc?

Ik heb een file PyCli.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/env bljython

import os
import bladelogic.cli.CLI as blcli

class PyCli:

    def __init__(self):
        """Initilize a JLI connection"""
        self.jli = blcli.CLI()
        self.jli.connect()


    def cmd(self, cmd):
        """Execute a command with jli, returns a string on succes, None on failure"""
        result = self.jli.run(cmd)
        if result.success():
           return result.returnValue
        else:
            print result.getError()
            return None


Nu draai ik happydoc over deze file, maar hij geeft de docstring niet weer in de gegenereerde documentatie.. En dat moet ie wel gaan doen.. Iemand een tip cq oplossing?
In theory there is no difference between theory and practice. In practice there is.
pi_60986763
Python is best ok, maar #python wordt bewaakt door een anal opper:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
17:27 <slacker_nl> lol
17:27 <Yhg1s> slacker_nl: please mind the rules.
17:28 <slacker_nl> Yhg1s: ?
17:28 <Yhg1s> slacker_nl: notice the topic.
17:28 <slacker_nl> lol @ no lol
17:29 <sproingie> someone's asking for it
17:29 <nopper> what for lol?
17:29 <Yhg1s> sigh.
17:29 <nopper> :D
17:29 <sproingie> Yhg1s: kids these days
17:29 <slacker_nl> ok ok, i will rofl then
17:29 <Yhg1s> slacker_nl: or you can just not type anything.
17:29 <nopper> lmao is officially supported?
17:29 <Yhg1s> no.
17:29 <slacker_nl> also an option, having a bad day?
17:29 <Yhg1s> retarded comments in general are strongly discouraged. forcefully, if necessary.
17:30 <nopper> i've to wait next release?
17:30 <Yhg1s> what we value is not the words you use, but the signal to noise ratio. Which is currently in a steep decline.
17:30 <nopper> i could have a noise-o-meter?
17:31 <slacker_nl> nopper, i want one as well
17:31 <nopper> yeah i'm waiting for Yhg1s
17:32 <slacker_nl> nopper, just say laughin out load as a tla and he will notice you
17:32 <Yhg1s> slacker_nl, nopper: or I can just ban you, if you prefer.
17:34 <slacker_nl> Yhg1s: you are having a bad day...
17:34 <Yhg1s> slacker_nl: nope.
In theory there is no difference between theory and practice. In practice there is.
  maandag 25 augustus 2008 @ 18:23:49 #66
187069 slacker_nl
Sicko pur sang
pi_61116622
Kan iemand me even helpen met het dynamisch laden van modules:

Ik wil namelijk alle files uit een directory importeren, instances aan te maken en wat stuff mee te doen:

ala:

1
2
3
4
5
for file in dir:
    # Strip .py from file
    import OSS.bladelogic.file
    k = file.file()
    k.do_stuff()
In theory there is no difference between theory and practice. In practice there is.
  maandag 25 augustus 2008 @ 19:34:16 #67
147503 Iblis
aequat omnis cinis
pi_61118631
quote:
Op maandag 25 augustus 2008 18:23 schreef slacker_nl het volgende:
Kan iemand me even helpen met het dynamisch laden van modules:

Ik wil namelijk alle files uit een directory importeren, instances aan te maken en wat stuff mee te doen:

ala:
[ code verwijderd ]
Wat je wilt gebruiken is __import__. Zie hier een proof of concept:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import os

BASE='test'
for filename in os.listdir(BASE):
    if not filename.endswith('.py'):
        continue
    filename = filename[:-3]
    # De fromlist zorgt ervoor dat je als module direct filename krijgt,
    # en niet 'BASE'. Stel dat je BASE/foo.py hebt, dan zou je zonder
    # fromlist hebben dat je mod.foo.bar moet hebben als bar een class
    # in foo is. Dit voorkomt dat. Eventueel kan het wel, maar dan moet
    # je herhaaldelijk getattr aanroepen, gebaseerd op de string BASE.filename.
    mod = __import__('%s.%s' % (BASE, filename), fromlist=filename)
    # Test is de naam van de klasse
    c = getattr(mod, 'Test')
    # Dit is de instantie
    o = c() 
    # En roep de functie aan.
    o.hello()


In de directory test heb ik een paar bestanden staan, die allemaal de volgende inhoud hebben:

1
2
3
class Test:
        def hello(self):
                print "Hello from %s." % __file__


Deze worden stuk voor stuk geladen, een instantie wordt gemaakt en hello() wordt aangeroepen. Eventueel kan dat ook dynamischer natuurlijk door middel van getattr. Ook een functie als hasattr kan je van dienst zijn. De uitvoer is nu iets als:

Hello from /home/Iblis/tmp/test/bar.pyc.
Hello from /home/Iblis/tmp/test/baz.pyc.
Hello from /home/Iblis/tmp/test/foo.pyc.
Hello from /home/Iblis/tmp/test/test.pyc.

Let dus op het probleem dat je kun hebben als je diep genest importeert, zoals OSS.bladelogic, dat je een paar keer recursief getattr moet doen, of de fromlist moet gebruiken, maar dat staat ook in de documentatie.
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
  maandag 25 augustus 2008 @ 19:36:52 #68
147503 Iblis
aequat omnis cinis
pi_61118694
En je kunt nog verder gaan met de IMP module waarmee je in feite je eigen definitie van __import__ zou kunnen schrijven als je dat zou willen.
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
pi_61120559
Thank you, heb er dit van gemaakt:

1
2
3
4
5
6
7
8
9
10
11
12
def load_modules(dir, module_prefix):
    for filename in os.listdir(dir):
        if not filename.endswith('.py') or not filename[0:1].isupper():
            continue

        file = filename[:-3]
        mod = __import__('%s.%s' % (module_prefix, file), fromlist=filename)
        c = getattr(mod, file)
        o = c()
        info(o)

load_modules("/home/wesleys/sbox/blpython/src/lib/OSS/bladelogic", "OSS.bladelogic")


Had het nodig om alle functies uit de verschillende klasses te printen. De info functie print de verschillende functies uit en de bijbehorende doc strings.

Overigens werkt de __import__ functie niet met jython (v2.2.1).

[ Bericht 2% gewijzigd door slakkie op 25-08-2008 20:53:54 ]
pi_61158072
quote:
Op maandag 25 augustus 2008 20:37 schreef slakkie het volgende:
Overigens werkt de __import__ functie niet met jython (v2.2.1).
En het werkt nu ook onder jython:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def load_modules(dir, module_prefix = None):
    files = os.listdir(dir)
    files.sort()
    for filename in files:
        if not filename.endswith('.py') or not filename[0:1].isupper():
            continue

        filename = filename[:-3]
        if module_prefix == None:
            module_name = filename
        else:
            module_name = '%s.%s' % (module_prefix, filename)

        # Work around for http://bugs.jython.org/issue1111
        # mod = __import__(modules, {}, {}, [ filename ], -1)
        mod = __import__(module_name)
        components = module_name.split('.')
        for comp in components[1:]:
            mod = getattr(mod, comp)

        c = getattr(mod, filename)
        o = c()
        info(o)
In theory there is no difference between theory and practice. In practice there is.
pi_61765513
Pfff... ik heb (als leek met XP) Python geïnstalleerd, en Apache... en probeer nu mod_python aan de gang te krijgen ivm Django, maar het lukt niet .

Apache kan de module niet importeren, denk ik.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Starting the Apache2.2 service
The Apache2.2 service is running.
] Apache/2.2.9 (Win32) configured -- resuming normal operations
[Fri Sep 19 18:38:47 2008] [notice] Server built: Jun 13 2008 04:04:59
[Fri Sep 19 18:38:47 2008] [notice] Parent: Created child process 560
[Fri Sep 19 18:38:47 2008] [error] python_init: Python version mismatch, expected '2.5', found '2.5.2'.
[Fri Sep 19 18:38:47 2008] [error] python_init: Python executable found 'C:\\webroot\\bin\\httpd.exe'.
[Fri Sep 19 18:38:47 2008] [error] python_init: Python path being used 'c:\\Python25\\python25.zip;.\\DLLs;.\\lib;.\\lib\\plat-win;.\\lib\\lib-tk;C:\\webroot\\bin'.
[Fri Sep 19 18:38:47 2008] [notice] mod_python: Creating 8 session mutexes based on 0 max processes and 64 max threads.
[Fri Sep 19 18:38:47 2008] [notice] Child 560: Child process is running
[Fri Sep 19 18:38:47 2008] [notice] Child 560: Acquired the start mutex.
[Fri Sep 19 18:38:47 2008] [notice] Child 560: Starting 64 worker threads.
[Fri Sep 19 18:38:47 2008] [notice] Child 560: Starting thread to listen on port 80.
[Fri Sep 19 18:40:26 2008] [error] make_obcallback: could not import mod_python.apache.\n
'import site' failed; use -v for traceback
'import site' failed; use -v for traceback
ImportError: No module named mod_python.apache
[Fri Sep 19 18:40:26 2008] [error] make_obcallback: Python path being used "['c:\\\\Python25\\\\python25.zip', '.\\\\DLLs', '.\\\\lib', '.\\\\lib\\\\plat-win', '.\\\\lib\\\\lib-tk', 'C:\\\\webroot\\\\bin']".
[Fri Sep 19 18:40:26 2008] [error] get_interpreter: no interpreter callback found.
[Fri Sep 19 18:40:26 2008] [error] [client 127.0.0.1] python_handler: Can't get/create interpreter., referer: http://localhost/test/

'k Dacht dat ik toch alles netjes volgens de tutorial/installatie-dinges had gedaan...
pi_63388159
Schop.

Python op beginnersniveau vraag:

Ik ben een class aan het schrijven. Deze bevat enkele functies. Nu wil ik van 1 van de functies het resultaat vastleggen in een string, zodat (wanneer ik de class importeer naar een ander document) deze kan oproepen. Ik heb gelezen dat dit kan door return className(naamString) aan het eind van je functie te schrijven, maar dit werkt niet. Dit is wellicht een cryptische omschrijving, maar hoop dat het een beetje duidelijk is en iemand weet hoe dit mogelijk is.
  donderdag 20 november 2008 @ 22:22:03 #73
147503 Iblis
aequat omnis cinis
pi_63388285
Ik snap niet helemaal wat je wilt eerlijk gezegd. Stel ik heb een bestand spam.py:

1
2
3
4
5
class spam:
    def eggs(self):
        x = 1 + 2 
        r = str(x)
        return r


Dan kan ik in Python doen:

1
2
3
4
>>> import spam
>>> s = spam.spam()
>>> s.eggs()
'3'


Is dat wat je wilt? Of wanneer wil je precies die string tevoorschijn toveren?
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
pi_63388733
Wow, snelle reactie!

Het is niet helemaal wat ik bedoel.

1
2
3
4
5
6
7
8
class spam
    def comp(self, s):
        self.change=list(s)
        reversed=self.change.reverse()
        stringreversed="".join(reversed)
        print "Reversed version", stringreversed
        
        return Sequence(stringreversed)


Dat laatste is het probleem. Ik wil die string namelijk ook kunnen oproepen wanneer ik in een andere functie zit te werken.
  donderdag 20 november 2008 @ 22:42:25 #75
147503 Iblis
aequat omnis cinis
pi_63389069
quote:
Op donderdag 20 november 2008 22:33 schreef Clyde_Frog het volgende:
Wow, snelle reactie!

Het is niet helemaal wat ik bedoel.
[ code verwijderd ]

Dat laatste is het probleem. Ik wil die string namelijk ook kunnen oproepen wanneer ik in een andere functie zit te werken.
Maar je wilt dus dat die comp() de laatste input opslaat? Dus je roept ergens comp('1234') aan, het resultaat hiervan ('4321') wordt opgeslagen en je kunt 100 regels verder over dit laatste resultaat beschikken?
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
pi_63389206
Psies. :$ Of ik zou alles in 1 functie moeten zetten zodat ik dat niet hoeft te doen, maar dat wordt een beetje lastig.
  donderdag 20 november 2008 @ 22:52:35 #77
147503 Iblis
aequat omnis cinis
pi_63389453
quote:
Op donderdag 20 november 2008 22:45 schreef Clyde_Frog het volgende:
Psies. :$ Of ik zou alles in 1 functie moeten zetten zodat ik dat niet hoeft te doen, maar dat wordt een beetje lastig.
Het is meestal geen teken van een goed programmeerontwerp als je zoiets wilt doen. Meestal is het duidelijker dat je variabele meegeeft waarin je het resultaat bewaart, maar zoiets zou kunnen:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class spam:
    def __init__(self):
        self.revstr = ''

    def comp(self, s):
        self.revstr = ''.join(list(s)[::-1])
        return self.revstr

s = spam()
t = spam()
print s.comp('123')
print t.comp('456')
print "Nu iets anders"
print t.revstr
print "Nog iets anders."
print s.revstr


Elke instantie krijgt dus een variabele als je namelijk:
1
2
3
class spam:
  revstr = ''
   ....


doet creëer je een klasse-variabele, dat wil je niet. Die wordt gedeeld tussen alle instanties. Verder moet je er rekening mee houden dat de reverse() call ‘in-place’ is, dus reversed=self.change.reverse() verandert self.change, en kent niet het resultaat toe aan reversed. Ik gebruik een slice om direct de reveral te doen, maar enfin…
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
pi_63389629
Python

tevens TVP !
pi_63390070
quote:
Op donderdag 20 november 2008 22:52 schreef Iblis het volgende:

[..]

Het is meestal geen teken van een goed programmeerontwerp als je zoiets wilt doen. Meestal is het duidelijker dat je variabele meegeeft waarin je het resultaat bewaart, maar zoiets zou kunnen:
[ code verwijderd ]

Elke instantie krijgt dus een variabele als je namelijk:
[ code verwijderd ]

doet creëer je een klasse-variabele, dat wil je niet. Die wordt gedeeld tussen alle instanties. Verder moet je er rekening mee houden dat de reverse() call ‘in-place’ is, dus reversed=self.change.reverse() verandert self.change, en kent niet het resultaat toe aan reversed. Ik gebruik een slice om direct de reveral te doen, maar enfin…
Ja klopt , ik heb het in mn originele programma zonder variabele staan, had het even snel gekopieerd en netjes gemaakt, want het is een nogal grote class.om hier te posten.

Maar bedankt voor je post, ik zal eens kijken wat ik er mee kan.
pi_63391811
quote:
Op vrijdag 28 december 2007 18:00 schreef Dr.Daggla het volgende:

[..]

.
Lambo of Rekt
  maandag 12 oktober 2009 @ 15:57:09 #81
73930 Blinker
Only one Go Ahead Eagles
pi_73613337
quote:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env python

from SocketServer import TCPServer, ThreadingMixIn, StreamRequestHandler
from optparse import OptionParser

class ClientHandler(StreamRequestHandler):
    def handle(self):
        data = self.rfile.readline().strip()
        f = open('/proc/cpuinfo', 'r')
        g = open('/proc/version', 'r')

        self.wfile.write('<h1>Welkom op mijn Python Webserver</h1><p>')
        self.wfile.write('<b>Hier wordt de cpuinfo afgebeeld:</b></p>')
        self.wfile.write(f.read())
        self.wfile.write('<b><p>Dit is de versie :</p></b>')
        self.wfile.write(g.read())

class myServer( ThreadingMixIn, TCPServer ):
    allow_reuse_address = True

if __name__ == "__main__":

    parser = OptionParser()

    parser.add_option("-p", "--port", default = 1335, type="int", dest="port")

    (options, args) = parser.parse_args()

    server = myServer(
        ('',options.port), ClientHandler )
    server.serve_forever()
Ik heb deze code, maar als output krijg ik een laptekst aan elkaar.
Hoe kan ik het zo filteren, zodat ik dezelfde output krijg als ik bijvoorbeeld in de shell dit invul: cat /proc/cpuinfo ipv aan één stuk.
  maandag 12 oktober 2009 @ 16:07:53 #82
147503 Iblis
aequat omnis cinis
pi_73613712
Wat bedoel je met ‘één stuk’? Geen regeleindes? Dat komt omdat je het denk ik met een browser bekijkt. In HTML bestaan regeleindes niet natuurlijk. Althans, die worden niet zo weergegeven. Een oplossing is om een <pre> ... </pre> mee te zenden, voor en na f.read() en anders zul je <br/> moeten invoegen.

Een snelle maar weinig schone oplossing is:

self.wfile.write(f.read())

Vervangen door:

self.wfile.write('<br/>'.join(f.readlines()))
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
  maandag 12 oktober 2009 @ 16:15:02 #83
73930 Blinker
Only one Go Ahead Eagles
pi_73613980
Uitstekend! <pre></pre> did the job!

Duizend maal dank
  maandag 12 oktober 2009 @ 16:21:09 #84
147503 Iblis
aequat omnis cinis
pi_73614182
Voor de goede orde: je probleem is dus eigenlijk dat in HTML regeleindes meestal geen speciale betekenis hebben. Het is whitespace, maar ook niet meer dan dat. Een alinea geef je aan m.b.v. <p>…</p> en andere regeleindes met <br/>. Het is niet Python die hier de regeleindes ‘verknoeit’ dus, maar je browser.
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
  maandag 12 oktober 2009 @ 16:31:15 #85
73930 Blinker
Only one Go Ahead Eagles
pi_73614517
Juist ja. Ik heb 'm door. Klinkt ook best logisch, alleen een oplossing kon ik even niet zo snel verzinnen.
Maar dit werkt goed.
:
Nog een ding, ik beschik nu over een webpagina waar alle informatie staat.
Nu zou ik graag het onderbrengen onder twee sub-pagina's en doorlinken.
quote:
1
2
3
4
      
                    hoofdpagina
                     /      \
                 cpuinfo     freemem
Hoe kan ik dat het beste aanpakken?

bvd
  maandag 12 oktober 2009 @ 16:33:45 #86
147503 Iblis
aequat omnis cinis
pi_73614585
Goede vraag, dat weet ik zo niet, je moet dan even kijken of je in die handle method bij de oorspronkelijke request kunt komen. Op basis van de request kun je dan iets anders teruggeven.
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
pi_73615544
Een pythontopic, ik wist niet dat dat bestond. .

Goed, bij deze zojuist gedane ontdekking heb ik meteen een (ongetwijfeld kinderlijk eenvoudige) vraag. Ik probeer nu met de module multiprocessing via Process een childproces aan te maken. Hoe kan ik exceptions die door het childprocess geraised worden opvangen in het parentprocess? Kan dat met multiprocessing.Process of is het beter iets anders te gebruiken?
  maandag 12 oktober 2009 @ 17:09:33 #88
147503 Iblis
aequat omnis cinis
pi_73615816
quote:
Op maandag 12 oktober 2009 17:00 schreef thabit het volgende:
Een pythontopic, ik wist niet dat dat bestond. .

Goed, bij deze zojuist gedane ontdekking heb ik meteen een (ongetwijfeld kinderlijk eenvoudige) vraag. Ik probeer nu met de module multiprocessing via Process een childproces aan te maken. Hoe kan ik exceptions die door het childprocess geraised worden opvangen in het parentprocess? Kan dat met multiprocessing.Process of is het beter iets anders te gebruiken?
Volgens mij niet. Als ik het zo bekijk zul je een Queue of een Pipe moeten gebruiken.

Dus je vangt een exceptie af, en propt die in een queue die dan uitgelezen wordt door de parent.

De processen delen niet expliciet geheugenruimte (dat zou namelijk allerhande race-condities in de hand werken) en kunnen dus ook niet zo elkaars exceptions afvangen, aangezien dat in feite objecten zijn die door een proces gegenereerd worden.

Wel kun je ze dus in een queue stoppen en eventueel in de parent re-raisen.
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
pi_73616163
Okee, dus gewoon een try-blok neerzetten en de exceptie in de Pipe/Queue gooien. Ik zal het eens proberen!
  maandag 12 oktober 2009 @ 17:29:11 #90
147503 Iblis
aequat omnis cinis
pi_73616396
quote:
Op maandag 12 oktober 2009 17:20 schreef thabit het volgende:
Okee, dus gewoon een try-blok neerzetten en de exceptie in de Pipe/Queue gooien. Ik zal het eens proberen!
Ik denk trouwens dat het beter is om te proberen in de child de boel te fiksen, als er wat aan te fiksen valt, en het alleen als dat niet kan door te gooien.

Want allerlei inspection e.d. die je normaal kunt doen kan niet meer in de parent, omdat je niet bij de variabelen/gegevens van je child kunt.

Ik weet niet of het de netste manier is om Exceptions, die van nature tamelijk proces-specifiek zijn, in een Queue te proppen. Want hoe wilde je de traceback in de parent doen b.v.?
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
pi_73616722
Natuurlijk is het de bedoeling om alles zoveel mogelijk te fiksen en idealiter zijn er geen exceptions. Maar er kunnen natuurlijk altijd fouten optreden en ik wil niet dat de parent deadlockt op het moment dat de child in de soep draait. Dus vraag ik me af wat de handigste manier is om dit op te lossen.
pi_73616764
Wat toevallig, een vrij late bump van dit topic (in mijn AT), maar ik ben sinds paar dagen écht begonnen met Python. Ben nu vooral aan het richten op Django, maar aantal scriptjes inclusief venstertjes is al gelukt.
pi_73637617
Doen jullie wel 's wat met Google App Engine? En dat evt in combi met Django?
pi_73800982
Ook hier even mijn vraag stellen.:
quote:
Beste,

Vooraf, PY staat voor Python en DJ voor het webframework Django. Ik ben hier nog niet zo lang mee bezig en ik vind het best leuk.

Stel je hebt een inlogpagina. Op het moment dat je al ingelogd bent en je bezoekt die pagina dan krijg je een melding dat je al ingelogd bent. Of als je wilt uitloggen, terwijl je niet uitgelogd bent krijg je daar ook een melding van. Qua opbouw hetzelfde dus ik wil hier geen twee templates voor gebruiken. DRY dus. (Vroeger in php gebruikte ik hier een MessageException voor.)

Dus ik denk ik los dit zo op.
return render_to_response('message.html', {"title": "Login", "content": "U bent succesvol ingelogd."})

Dit werkt goed, totdat ik iets wilde doen als <a href="link">Klik hier om door te gaan</a>. Dit loste ik op door in message.html "{{ content|safe }}" te doen ipv zonder |safe.

Maar als ik nou {% url iuser.views.login %} als link wil doen, dan wordt dat letterlijk genomen en niet omgezet tot een link. Logisch, want het is een template tag en geen view tag ofzo. Hiervoor is dan de oplossing urlresolvers.reverse. Alleen dit krijg ik niet aan de praat. Help!

Daarnaast vind ik het nog niet goed dat ik nou html gebruik in een view. Is dit not done, of in dit geval wel verantwoord toegepast? Zijn er (betere) alternatieven om zo'n standaard bericht terug te sturen?

Nou heb ik ook nog een tweede vraag. Ik heb het volgende scriptje gevonden: klik. Dit lijkt mij wel handig, maar ik heb geen idee waar ik dit moet plaatsen. Daarnaast weer mijn vraag, is dit 'verantwoord'? (Niet tegen een bepaalde principe (van Python/Django) in ofzo)

Alvast bedankt,

Michiel
  zondag 18 oktober 2009 @ 12:52:36 #95
147503 Iblis
aequat omnis cinis
pi_73801841
Ik heb helaas helemaal geen verstand van CMS – maar heeft Django niet en heel levendige community? Dat is wel vaak het geval bij zulke projecten. Het ‘nadeel’ is wel dat je je vraag in het Engels zult moeten stellen.
Daher iſt die Aufgabe nicht ſowohl, zu ſehn was noch Keiner geſehn hat, als, bei Dem, was Jeder ſieht, zu denken was noch Keiner gedacht hat.
pi_73802170
Oh vast wel. Ik probeer het eerst even hier, proberen kan geen kwaad. Ik zal over een paar dagen wel opzoek gaan naar zo'n community. Bedankt iig.
pi_73958987
GUI-gerelateerde zaken, daar heb ik nul komma nul verstand van.

Ik zal in elk geval een stukje code hier posten dat mijn eerdere vraag behandelt. Ongetwijfeld kan er vanalles aan bijgeschaafd worden. Het werkt erg goed. Met dank ook aan Iblis voor een aantal tips.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class ChildProcessError(RuntimeError):
    """
    A parent process may raise this if a child process produces an error.
    """
    pass
    

def execute_in_child_process(f, traceback_file="traceback"):
    """
    Decorator that makes a function execute in a child process.
    
    INPUT: 
     - ``f`` - function 
     - ``traceback_file`` - string (default: "traceback") 
     
    OUTPUT:
     - function - create a child process, call f from there and return f's result
     
    REMARKS:
     - The side effects of f (such as caching) are thrown away.  So make 
       sure that all important information is in the output of f.  In fact,
       reducing memory leaks is the intended use of the decorator.      
     - If f raises an exception, the traceback is stored in traceback_file
       and a ChildProcessError is raised by the new function.
     
    EXAMPLES: TODO
    """
    def new_f(*args, **kwargs):
        def child_process(conn):
            try:
                result = f(*args, **kwargs)
            except BaseException:
                message = "the traceback is in the file '%s'" % traceback_file
                conn.send(ChildProcessError(message))
                conn.close()
                with open(traceback_file, 'a') as tr_file:
                    traceback.print_exc(file=tr_file)
                return
            conn.send(result)
            conn.close()
        parent_conn, child_conn = Pipe()
        p = Process(target=child_process, args=(child_conn,))
        p.start()
        result = parent_conn.recv()
        p.join()
        if isinstance(result, ChildProcessError):
            raise result
        return result
    return new_f


[ Bericht 0% gewijzigd door thabit op 22-10-2009 19:21:00 ]
pi_75661412
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
aantalsoorten = 4

for aantalpersoort in range(1,20):
    if aantalpersoort == 1:
        prijsperstuk = 1.85
    elif 1 < aantalpersoort < 6:
        prijsperstuk = 1.70
    else:
        prijsperstuk = 1.55
    
    aantal = aantalsoorten * aantalpersoort
    
    if 2 < aantal < 6:
        verzendkosten = 1.76
    elif 6 <= aantal < 11:
        verzendkosten = 3.60
    else:
        verzendkosten = 6.75
   
    totaalkosten = verzendkosten + aantal*prijsperstuk
    
    totaalperstuk = totaalkosten / float(aantal)
    print (int(totaalperstuk*100)-160) * "X", aantalpersoort, "->", "%.2f" % totaalperstuk

Whehehe.
Mijn eerste IRL toepassing om te schatten wat een optimale bestelhoeveelheid beefjerky is .

Output:
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 1 -> 2.29
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 2 -> 2.15
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 3 -> 2.26
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 4 -> 2.12
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 5 -> 2.04
XXXXXXXXXXXXXXXXXXXXXXX 6 -> 1.83
XXXXXXXXXXXXXXXXXXX 7 -> 1.79
XXXXXXXXXXXXXXXX 8 -> 1.76
XXXXXXXXXXXXX 9 -> 1.74
XXXXXXXXXXX 10 -> 1.72
XXXXXXXXXX 11 -> 1.70
XXXXXXXXX 12 -> 1.69
XXXXXXX 13 -> 1.68
XXXXXXX 14 -> 1.67
XXXXXX 15 -> 1.66
XXXXX 16 -> 1.66
XXXX 17 -> 1.65
XXXX 18 -> 1.64
XXX 19 -> 1.64
  woensdag 5 mei 2010 @ 15:42:50 #99
111382 Ofyles2
Bestemming: onbekend
pi_81051595
* Ofyles2 schopt dit topic omhoog.

Eerstens: ik ben sinds kort verslaafd geworden aan Python (dit in combinatie met Qt4)
Tweedens: dit topic raakt ondergesneeuwd door de andere talen.
pi_81907050
Kennen jullie trouwens Cython? Dat is echt geweldig. 't Is een soort mix van C en Python, the best of both worlds als het ware, de snelheid van C en de syntax van Python. Het is een gecompileerde variant op Python, waarin je de mogelijkheid hebt om statische typedeclaraties te doen, C types te gebruiken en als je wilt zelf ook je deallocatieprocedures te schrijven, etc. De meeste pure Python code compileert het overigens ook gewoon.
abonnement Unibet Coolblue Bitvavo
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')