Créer un objet qui définit une réunion de plages horaires dans un journée

Le
Francois Lafont
Bonjour à tous,

Je cherche à me créer une classe qui me permettra d'instancier un
objet me permettant de représenter des réunion de plages horaires
avec une méthode m'indiquant si, au moment de l'exécution du script,
on est ou non dans une des plages.

J'ai aucune idée de la syntaxe (pour l'instant). Par exemple un truc
du genre :

time_slots = Time_slots('[6:00-7h30]')
time_slots.is_in()

qui renverra true ou false suivant qu'on est entre 6h00 et 7h30
(du matin) ou non au moment de l'exécution du script. Avec une
réunion de plages, je ne trouve pas de syntaxe élégante mais il
faut que je trouve une chaîne de caractères permettant de
représenter une réunion de plages horaires.

Ma question : existe-t-il des modules Python de la bibliothèque
standard permettant de réaliser cela sans partir de zéro ?

Merci d'avance.

--
François Lafont
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Damien Wyart
Le #25984242
* Francois Lafont
Je cherche à me créer une classe qui me permettra d'instancier un
objet me permettant de représenter des réunion de plages horaires avec
une méthode m'indiquant si, au moment de l'exécution du script, on est
ou non dans une des plages.

Ma question : existe-t-il des modules Python de la bibliothèque
standard permettant de réaliser cela sans partir de zéro ?



Pas grand'chose de tout fait, mais quelques pistes pour un intervalle
unique :

http://stackoverflow.com/questions/2634127/how-do-i-check-if-a-given-datetime-object-is-between-two-datetimes
http://stackoverflow.com/questions/10048249/how-do-i-determine-if-current-time-is-within-a-specified-range-using-pythons-da
http://stackoverflow.com/questions/18884017/how-to-check-in-python-if-im-in-certain-range-of-times-of-the-day

Ensuite, c'est facile à généraliser à une liste (au sens Python)
d'intervalles.

--
DW
Laurent Pointal
Le #25985082
Francois Lafont wrote:

Bonjour à tous,

Je cherche à me créer une classe qui me permettra d'instancier un
objet me permettant de représenter des réunion de plages horaires
avec une méthode m'indiquant si, au moment de l'exécution du script,
on est ou non dans une des plages.

J'ai aucune idée de la syntaxe (pour l'instant). Par exemple un truc
du genre :

time_slots = Time_slots('[6:00-7h30]')
time_slots.is_in()

qui renverra true ou false suivant qu'on est entre 6h00 et 7h30
(du matin) ou non au moment de l'exécution du script. Avec une
réunion de plages, je ne trouve pas de syntaxe élégante mais il
faut que je trouve une chaîne de caractères permettant de
représenter une réunion de plages horaires.

Ma question : existe-t-il des modules Python de la bibliothèque
standard permettant de réaliser cela sans partir de zéro ?



A priori non. Éventuellement tu peux réutiliser le type datetime.time pour
le stockage des heures, ce qui fournit une base de comparaison ainsi que des
méthodes pour le formatage iso & Co.

Quelques idées quand même:

* Revoir le PEP8 pour les identificateurs --> Time_slots ==> TimeSlots

* Permettre d'utiliser des flottants pour représenter les heures en
extérieur, genre partie entière=heures et partie décimale=minutes (limitées
dont à 59) - même si en interne tu utilises datetime.time - ce qui permet
des choses plus sympa à taper et à lire (et moins de trucs à parser à partir
de chaînes de caractères). Ainsi tu pourrais écrire:

plage = TimeSlots(6.30, 7.30)

* Définir la méthode __contains__(self, val) dans ta classe, ce qui te
permettrait d'avoir des expressions plus élégantes du genre:

if heure in plage:
print("C'est l'heure!")


Merci d'avance.




Bon codage.

Laurent.
Francois Lafont
Le #25996602
Bonsoir,

Merci à tous les deux, Laurent et Damien, pour vos réponses.
Je vais essayer de coder un truc dès que j'aurai plus de temps
et je le posterai ici, des fois que ayez des remarques (je suis
toujours preneurs de critiques constructives même sur la forme ;-)).

Merci encore.
À bientôt.

--
François Lafont
Francois Lafont
Le #26036112
Bonjour à tous,

Le 18/02/2014 01:48, Francois Lafont a écrit :

Je vais essayer de coder un truc dès que j'aurai plus de temps
et je le posterai ici, des fois que ayez des remarques [...]



Voilà, désolé pour ma réponse tardive (problème de temps toussa ;-)).
Ci-dessous vous trouverez le code que j'ai écrit à la lumière des
remarques de Damien et Laurent. Il a été testé sous Debian Wheezy
avec Python 2.7.3.

Comme d'hab, je suis toujours preneurs de remarques, conseils etc.
Par exemple :

- Est-ce qu'au niveau de la forme ça respecte les bonnes pratiques en
Python ? Les identificateurs, les sauts de lignes etc.

- Au niveau du code, est-ce que je ne passe pas à côté de certains
idiomes classiques en python ?

- Au niveau du découpage des classes, est-ce correct ? Là j'ai fait
3 classes avec une classe TimeSlotsParser qui est un peu à part (on
appelle ça une classe statique il me semble ?). Je ne sais pas si
c'est un bon choix. Sachant que j'ai besoin de cette fonctionnalité
car en pratique c'est par l'intermédiaire d'un fichier texte plat
que je vais récupérer les données nécessaires pour créer mes objets
TimeSlots.

Voilà. Merci de vos éventuels retours.

--------------------------------------------------
#!/usr/bin/python
# -*- coding: utf8 -*-

import datetime
import re


class TimeSlotsParser:
"""This class applies a static method to convert a specific string to a TimeSlots object.

s = u'[00h00;00h50][19h30;23h59]'
timeslots = TimeSlotsParser.string2timeslots(s)

t_out = datetime.time(0,53)
t_out in timeslots






False

t_in = datetime.time(0,0)
t_in in timeslots






True
"""
timeslots_pattern = r'^([d+hd+;d+hd+])+$'
timeslots_regex = re.compile(timeslots_pattern)
numbers_regex = re.compile(r'd+')

@staticmethod
def string2timeslots(s):
assert isinstance(s, unicode)
s = s.replace('t', '').replace(' ', '').lower()
assert TimeSlotsParser.timeslots_regex.match(s)
numbers = TimeSlotsParser.numbers_regex.findall(s)
timeslots = []
for i in xrange(0, len(numbers), 4):
t1 = datetime.time(int(numbers[i]), int(numbers[i+1]))
t2 = datetime.time(int(numbers[i+2]), int(numbers[i+3]))
timeslots.append(TimeSlot(t1,t2))
return TimeSlots(timeslots)


class TimeSlot:
"""Represents a time slot.
Takes 2 datetime.time arguments and represents the time
slot between this 2 datetimes. In this example below,
ts is represents [14h30; 17h47] time slot.

t1 = datetime.time(14, 30)
t2 = datetime.time(17, 47)
ts = TimeSlot(t1, t2)

t_in = datetime.time(14, 30)
t_out = datetime.time(14, 29)
t_in in ts






True
t_out in ts






False
"""
def __init__(self, t1, t2):
assert isinstance(t1, datetime.time) and isinstance(t1, datetime.time)
assert t1 <= t2
self.t1 = t1
self.t2 = t2

def __contains__(self, time):
assert isinstance(time, datetime.time)
# Round the time to the minute.
rounded_time = datetime.time(time.hour, time.minute)
return self.t1 <= rounded_time <= self.t2


class TimeSlots:
"""Represents a union of TimeSlot objects.
Takes one argument which must be a list of TimeSlot objects.

t = datetime.time(20,4)

a1 = datetime.time(14, 30)
a2 = datetime.time(17, 47)
tsa = TimeSlot(a1, a2)

b1 = datetime.time(19, 31)
b2 = datetime.time(20, 9)
tsb = TimeSlot(b1, b2)

timeslots = TimeSlots([tsa])
t in timeslots






False

timeslots.add(tsb)
t in timeslots






True
"""
def __init__(self, timeslots):
assert isinstance(timeslots, list)
for ts in timeslots:
assert isinstance(ts, TimeSlot)
self.timeslots = timeslots

def add(self, timeslot):
assert isinstance(timeslot, TimeSlot)
self.timeslots.append(timeslot)

def __contains__(self, time):
for timeslot in self.timeslots:
if time in timeslot:
return True
return False


if __name__ == '__main__':
import doctest
doctest.testmod()
--------------------------------------------------


--
François Lafont
Publicité
Poster une réponse
Anonyme