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 FAQquote:Op dinsdag 24 juni 2008 19:15 schreef slacker_nl het volgende:
Kan je niet beter while row = cs.fetchone(): doen?
| 1 2 3 4 | row = cs.fetchone() if row == None: break # do stuff |
Met wegschrijven bedoel ik het INSERT-en in m'n tabel. De rest van je tips ga ik nu uitproberen.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’.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | 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 |
| 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 <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. |
| 1 2 3 4 5 | # Strip .py from file import OSS.bladelogic.file k = file.file() k.do_stuff() |
Wat je wilt gebruiken is __import__. Zie hier een proof of concept: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 ]
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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() |
| 1 2 3 | def hello(self): print "Hello from %s." % __file__ |
| 1 2 3 4 5 6 7 8 9 10 11 12 | 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") |
En het werkt nu ook onder jython:quote:Op maandag 25 augustus 2008 20:37 schreef slakkie het volgende:
Overigens werkt de __import__ functie niet met jython (v2.2.1).
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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) |
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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/ |
| 1 2 3 4 5 | def eggs(self): x = 1 + 2 r = str(x) return r |
| 1 2 3 4 | >>> s = spam.spam() >>> s.eggs() '3' |
| 1 2 3 4 5 6 7 8 | def comp(self, s): self.change=list(s) reversed=self.change.reverse() stringreversed="".join(reversed) print "Reversed version", stringreversed return Sequence(stringreversed) |
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?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.
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: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.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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 |
| 1 2 3 | revstr = '' .... |
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.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…
Ik heb deze code, maar als output krijg ik een laptekst aan elkaar.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()
Hoe kan ik dat het beste aanpakken?quote:
1
2
3
4
hoofdpagina
/ \
cpuinfo freemem
Volgens mij niet. Als ik het zo bekijk zul je een Queue of een Pipe moeten gebruiken.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?
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.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!
|
|
| Forum Opties | |
|---|---|
| Forumhop: | |
| Hop naar: | |