@mobby: Einrückung ist per Konvention vier Leerzeichen pro Ebene.
Namen sollte man nur abkürzen wenn die Abkürzung allgemein bekannt ist. Einbuchstabige Namen möglichst nur verwenden wenn es tatsächlich einbuchstabige Namen sind, es also keine längere Schreibweise gibt, oder wenn der Gültigkeitsbereich stark begrenzt ist, also zum Beispiel in ``lambda``-Definitionen, „list comprehensions”, oder Generatorausdrücken.
Das `thread`-Modul sollte nicht mehr verwendet werden. Das ist durch das `threading`-Modul abgelöst worden.
`date` aus `datetime` wird importiert aber nicht verwendet.
Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert und keine globalen Datenstrukturen die verändert werden. Funktionen und Methoden sollten ausser Konstanten nur Werte verwenden die als Argumente übergeben wurden. Das betrifft `buffer`. Der Name ist auch etwas ungünstig, weil das der Name eines eingebauten Datentyps ist.
Funktionsnamen sind üblicherweise Tätigkeiten die beschreiben was die Funktion tut. `mysql()` ist keine Tätigkeit. `write()` schreibt nichts sondern startet einen Thread, `list_clear()` leert zwar eine Liste, schreibt aber auch einen Wert in eine Datenbank. Bei ``def list_value(add)`` sind irgendwie Teile des Funktionsnamens und des Arguments durcheinander gekommen, denn das Argument ist ja der Wert der hinzugefügt wird, würde also passender `value` heissen, während die Tätigkeit der Funktion mit `add` bezeichnet werden könnte.
Das zurücksetzen der Liste würde ich vor dem Eintragen in die Datenbank machen, weil das im Verhältnis zur Messfrequenz doch etwas länger dauern kann, und einem dann Messungen verloren gehen.
Werte sollte man nicht selber in Zeichenketten mit SQL-Anweisungen hineinformatieren. Das ist eine Sicherheitslücke (SQL-Injection) und kann ausserdem ineffizient sein, weil das DBMS jedes mal die SQL-Anweisung neu parsen und in einen Ablaufplan übersetzen muss, statt das nur einmal zu tun und das Ergebnis zu cachen.
Ich komme dann ungefähr bei so etwas heraus (ungetestet):
Code: Alles auswählen
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
from contextlib import closing
from itertools import groupby
from threading import Thread
from time import sleep
import MySQLdb
import pifacedigitalio as piface
def insert_into_database(timestamp, amount):
with closing(
MySQLdb.connect(host='localhost', user='root', passwd='', db='')
) as connection:
connection.cursor().execute(
'INSERT INTO water(timestamp, amount) VALUES (%s, %s)',
(timestamp, amount)
)
connection.commit()
def write_leading_edge_count(leading_edges):
while True:
timestamp = time.time()
leading_edge_count = len(leading_edges)
del leading_edges[:]
insert_into_database(timestamp, leading_edge_count)
sleep(300)
def start_writer(leading_edges):
thread = Thread(target=write_leading_edge_count, args=(leading_edges,))
thread.setDaemon(True)
thread.start()
def iter_values(frequency):
while True:
yield piface.digital_read(0)
sleep(1.0 / frequency)
def iter_changes(frequency):
for value, _ in groupby(iter_values(frequency)):
yield value
def main():
piface.init()
leading_edges = list()
start_writer(leading_edges)
for value in iter_changes(100):
if value == 1:
leading_edges.append(1)
if __name__ == '__main__':
main()
Wahrscheinlich würde ich den Code auch noch etwas anders auf Funktionen aufteilen, die Messung in einem eigenen Thread starten und nicht das Schreiben in die DB, und wohl eine Klasse für die Messung schreiben die einen Zähler hat, statt die Länge einer Liste zum Zählen zu verwenden.