Closed jaanos closed 2 years ago
Razmišljam, da bi v Pythonu stvari malo posplošil. Na primer, trenutno vsaka funkcija sprejme neobvezen argument env
, ki nastavi lokalno okolje. To bi bilo verjetno bolje narediti s context managerjem, da bi lahko napisal with Check.set_environment(x=10, y='abc')
. Ali bi se dalo kaj podobnega narediti tudi v R-ju?
V R obstaja funkcija with
, s katero se lahko nastavi lokalno okolje:
> x <- 1
> with(list(y = 2), {
+ z <- x+y
+ y <- y+40
+ x <- 7*x
+ cat(x, y, z)
+ })
7 42 3
> x
[1] 1
> y
Error: object 'y' not found
> z
Error: object 'z' not found
Bi to zadostovalo?
Malo sem gledal, kaj se da naredit v Pythonu, pa nekako izgleda, da tako nastavljanje lokalnega okolja, razen z eval
, sploh ni mogoče (da se sicer spremenit slovar locals()
, ampak je odvisno od implementacije, če se bo to dejansko poznalo na okolju). Še najbolj čista rešitev se mi zdi, da bi imeli nek globalen sklad okolij (npr. Check.env_stack
) - Check.set_environment
bi potem na vrh sklada dodal okolje, dopolnjeno z novimi vrednostmi (in ga ob izhodu pobrisal), vse ostale funkcije pa bi za env
uporabile okolje z vrha sklada, če ta parameter ni podan (tako da ohranimo združljivost trenutnih testov). @matijapretnar, kaj praviš?
V R-ju pa with
lepo deluje (namesto s seznamom lahko tudi z okoljem, tako da se spremembe poznajo). Sem včeraj implementiral check$run
, pa bom poskusil še z drugimi funkcijami.
Ja, to se mi zdi smiselno. Podobno bi imel tudi npr. za clean
ali kakšne nastavitve. Sicer pa običajno hočeš imeti vsa okolja, tako da ne bi vzel samo vrhnjega, ampak bi kar naredil update od prvega do zadnjega (tako da ima zadnji prednost).
Mislil sem, da ko se doda novo okolje, se naredi kopija vrhnjega in se jo dopolni z novimi vrednostmi (razen mogoče, če se eksplicitno zahteva sveže okolje). Ali si kako drugače mislil?
Aha, sem spregledal. Ja, je smiselno.
Ni treba, da ima testiranje za R popolnoma enake funkcije kot tisto za Python. Vmes se je tisto za Python spremenilo in ima npr. tudi testiranje generatorjev, ki ga v R nikoli ne bo. Tako da tole lahko mirno zapremo.
Z @jernejbanevec sva danes ugotovila, da za R ni vse funkcionalnosti, ki jo ponuja Tomo za Python. Kolikor vidim, manjka sledeče:
check$current.part
- kazalec na podatke za trenutni delcheck$equal
pove, ali je primerjava uspelacheck$run
check$in.file
check$input
check$out.file
check$output
check$difflines
Za prvi dve točki bom kar odprl pull request - ostalo lahko morda kasneje implementiramo.