"Schatz, wie sollen wir es nennen?" Suche passenden Namen...

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Guten morgen,

ich tu' mir mal wieder bei der Namensgebung schwer... Folgende Klasse verwende ich, um Argumente zum Erstellen und eventuell Berechnen eines datetime-objects zu sammeln, fehlende Argumente durch defaults zu ersetzen und schließlich ein datetime-object zurückzugeben.

Code: Alles auswählen

class DefaultDatetimeArgs(dict):
    DATETIME_ARG_NAMES = ('year', 'month', 'day', 'hour', 'minute')
    DELTA_ARG_NAMES = ('years', 'months', 'days', 'hours', 'minutes')

    def __init__(self, default_datetime=None):
        dict.__init__(self)
        default_datetime = default_datetime or datetime.datetime.now()
        self.datetime_args = dict(zip(self.DATETIME_ARG_NAMES, 
                                      default_datetime.timetuple()))
        self.delta_args = dict(zip(self.DELTA_ARG_NAMES,
                                   (0, 0, 0, 0, 0)))

    def __missing__(self, key):
        if key.endswith('s'):
            return self.delta_args[key]
        elif not key.endswith('s'):
            return self.datetime_args[key]

    def _datetime_args(self):
        return dict((key, self[key]) for key in self.DATETIME_ARG_NAMES)

    def _delta_args(self):
        return dict((key, self[key]) for key in self.DELTA_ARG_NAMES)

    def create(self):
        try:
            return (datetime.datetime(**self._datetime_args()) +
                    relativedelta.relativedelta(**self._delta_args()))
        #relativedelta raises several error-types... :-(
        except (ValueError, TypeError, OverflowError):
            raise ValueError(ERR_NO_VALID_DATETIME_ARGS.format(
                self['year'] + self['years'],
                self['month'] + self['months'],
                self['day'] + self['days'],
                self['hour'] + self['hours'],
                self['minute'] + self['minutes']))
'DefaultDatetimeArgs' ist eben nur die halbe Wahrheit. Es wird ja letztlich auch ein datetime-object berechnet und zurückgegeben. '...Factory' ist doch eigentlich was anderes, oder? '...Creator' klingt doof, hab' ich auch so noch nicht gesehen. Passt '...Generator'? Oder deutet mein Namensproblem darauf hin, dass die Klasse zu viel macht?

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
BlackJack

@mutetella: Ich fänd ja erst einmal interessant zu wissen was das überhaupt machen soll. :-)
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:@mutetella: Ich fänd ja erst einmal interessant zu wissen was das überhaupt machen soll. :-)
Das löst Probleme die man ohne es nicht hätte. :mrgreen:
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

@BlackJack
Ich verwende die Klasse in einer Funktion, die aus einer Argumentenliste datetime- und relativedelta-Argumente ermittelt und daraus ein datetime-object macht:

Code: Alles auswählen

def generate_datetime(datetime_args, date_args_order=None):
    ...
    ...
    datetime_values = DefaultDatetimeArgs()
    while datetime_args:
        arg = datetime_args.pop(0)
        ...
        ...
        arg_name = datetime_arg_names[directive]
        if arg_name not in datetime_values:
            datetime_values[arg_name], datetime_values[arg_name + 's'] = (
                translaters[arg_name](arg, datetime_values[arg_name]))
        elif arg_name in datetime_values:
            #see ticket 33
            raise ValueError(ERR_REPEATED_DATETIME_ARG.format(arg_name))
        else:
            raise ValueError(ERR_NO_VALID_DIRECTIVE.format(directive))
    return datetime_values.create()
Während dem Parsen werden also ermittelte Argumente in die 'DefaultDatetimeArgs'-Instanz gelegt bzw. damit geprüft, ob ein Argument bereits ermittelt wurde, was dann einen Fehler wirft.

mutetella
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mir ergibt sich der Sinn auch nicht so ganz. Die create-Methode sieht sehr seltsam aus und dann gibt es nebem delta_args noch _delta_args. Ich vermute mal, dass keine Tests nicht alles abdecken?

Aber: Gratulation zu dem gelungenen Threadtitel :-)
Das Leben ist wie ein Tennisball.
mutetella
User
Beiträge: 1695
Registriert: Donnerstag 5. März 2009, 17:10
Kontaktdaten:

Ihr hattet Recht... *rtlgrmpf*
Entspanne dich und wisse, dass es Zeit für alles gibt. (YogiTea Teebeutel Weisheit ;-) )
Antworten