J'aimerais importer tous les attributs dont le nom commence par 'K_'.
Un genre de 'from pygame import K_*'. Est-ce possible ? Comment ?
--
Le seul problème quand on garde l'esprit ouvert, c'est qu'on trouve
toujours quelqu'un qui tient absolument à y fourrer tout un tas de
choses.
-- T. Pratchett
J'aimerais importer tous les attributs dont le nom commence par 'K_'. Un genre de 'from pygame import K_*'. Est-ce possible ? Comment ?
import pygame for name in dir(pygame): if name startswith("K_"): exec "%s=pygame.%s" % (name, name)
NB : pas testé et franchement crado. Même si s'avérait produire le résultat escompté, je déconseille.
Bruno Desthuilliers
Amaury Forgeot d'Arc a écrit :
Bruno Desthuilliers a écrit :
Jogo a écrit :
Bonjour,
J'aimerais importer tous les attributs dont le nom commence par 'K_'. Un genre de 'from pygame import K_*'. Est-ce possible ? Comment ?
import pygame for name in dir(pygame): if name startswith("K_"): exec "%s=pygame.%s" % (name, name)
NB : pas testé et franchement crado. Même si s'avérait produire le résultat escompté, je déconseille.
Dans le même esprit, un peu moins crado à mon avis car on n'utilise pas "exec" :
import pygame for name in dir(pygame): if name.startswith("K_"): globals()[name] = getattr(pygame, name)
(et j'ai testé...)
Yeps - encore une confirmation du fait que les cas d'utilisation réels de exec (j'entend: les cas où il n'y a pas une solution plus explicite) sont vraiment rares !-)
Mais franchement, le problème fondamental reste le même AMHA - le même que celui posé par "from module import *" - à savoir qu'après ça, on ne sait pas _exactement_ ce qu'on a dans l'espace de nommage courant - ni, pour peu qu'on répète le gag avec un autre module, d'où vient quel nom.
Il m'est arrivé il y a quelques année, me croyant très intelligent, de faire comme ça des imports "automatiques" pour m'éviter quelques lignes de code sans grand intérêt. J'ai été très fier de moi jusqu'à ce que je doive débugger le machin quelques mois plus tard :(
Amaury Forgeot d'Arc a écrit :
Bruno Desthuilliers a écrit :
Jogo a écrit :
Bonjour,
J'aimerais importer tous les attributs dont le nom commence par 'K_'.
Un genre de 'from pygame import K_*'. Est-ce possible ? Comment ?
import pygame
for name in dir(pygame):
if name startswith("K_"):
exec "%s=pygame.%s" % (name, name)
NB : pas testé et franchement crado. Même si s'avérait produire le
résultat escompté, je déconseille.
Dans le même esprit, un peu moins crado à mon avis car on n'utilise pas
"exec" :
import pygame
for name in dir(pygame):
if name.startswith("K_"):
globals()[name] = getattr(pygame, name)
(et j'ai testé...)
Yeps - encore une confirmation du fait que les cas d'utilisation réels
de exec (j'entend: les cas où il n'y a pas une solution plus explicite)
sont vraiment rares !-)
Mais franchement, le problème fondamental reste le même AMHA - le même
que celui posé par "from module import *" - à savoir qu'après ça, on ne
sait pas _exactement_ ce qu'on a dans l'espace de nommage courant - ni,
pour peu qu'on répète le gag avec un autre module, d'où vient quel nom.
Il m'est arrivé il y a quelques année, me croyant très intelligent, de
faire comme ça des imports "automatiques" pour m'éviter quelques lignes
de code sans grand intérêt. J'ai été très fier de moi jusqu'à ce que je
doive débugger le machin quelques mois plus tard :(
J'aimerais importer tous les attributs dont le nom commence par 'K_'. Un genre de 'from pygame import K_*'. Est-ce possible ? Comment ?
import pygame for name in dir(pygame): if name startswith("K_"): exec "%s=pygame.%s" % (name, name)
NB : pas testé et franchement crado. Même si s'avérait produire le résultat escompté, je déconseille.
Dans le même esprit, un peu moins crado à mon avis car on n'utilise pas "exec" :
import pygame for name in dir(pygame): if name.startswith("K_"): globals()[name] = getattr(pygame, name)
(et j'ai testé...)
Yeps - encore une confirmation du fait que les cas d'utilisation réels de exec (j'entend: les cas où il n'y a pas une solution plus explicite) sont vraiment rares !-)
Mais franchement, le problème fondamental reste le même AMHA - le même que celui posé par "from module import *" - à savoir qu'après ça, on ne sait pas _exactement_ ce qu'on a dans l'espace de nommage courant - ni, pour peu qu'on répète le gag avec un autre module, d'où vient quel nom.
Il m'est arrivé il y a quelques année, me croyant très intelligent, de faire comme ça des imports "automatiques" pour m'éviter quelques lignes de code sans grand intérêt. J'ai été très fier de moi jusqu'à ce que je doive débugger le machin quelques mois plus tard :(
Amaury Forgeot d'Arc
Bruno Desthuilliers a écrit :
Jogo a écrit :
Bonjour,
J'aimerais importer tous les attributs dont le nom commence par 'K_'. Un genre de 'from pygame import K_*'. Est-ce possible ? Comment ?
import pygame for name in dir(pygame): if name startswith("K_"): exec "%s=pygame.%s" % (name, name)
NB : pas testé et franchement crado. Même si s'avérait produire le résultat escompté, je déconseille.
Dans le même esprit, un peu moins crado à mon avis car on n'utilise pas "exec" :
import pygame for name in dir(pygame): if name.startswith("K_"): globals()[name] = getattr(pygame, name)
(et j'ai testé...)
-- Amaury
Bruno Desthuilliers a écrit :
Jogo a écrit :
Bonjour,
J'aimerais importer tous les attributs dont le nom commence par 'K_'.
Un genre de 'from pygame import K_*'. Est-ce possible ? Comment ?
import pygame
for name in dir(pygame):
if name startswith("K_"):
exec "%s=pygame.%s" % (name, name)
NB : pas testé et franchement crado. Même si s'avérait produire le
résultat escompté, je déconseille.
Dans le même esprit, un peu moins crado à mon avis car on n'utilise pas
"exec" :
import pygame
for name in dir(pygame):
if name.startswith("K_"):
globals()[name] = getattr(pygame, name)
Dérivé de la méthode BD, mais avec une fonction, pour ne pas encombrer (libérer de) la mémoire, avec les éléments non sélectionnés :
Quelle mémoire penses-tu libérer ainsi ? Le module pygame est créé de toutes façons, avec tous ses attributs.
def impselect(nom,debut): import imp fp, pathname, description = imp.find_module(nom) modul=imp.load_module(nom, fp, pathname, description) fp.close() result='from '+nom+' import ' for name in dir(modul): if name.startswith(debut): result += name+',' return(result[:-1])
exec(impselect('pygame','K_'))
@+
Jogo
> import pygame for name in dir(pygame): if name.startswith("K_"): globals()[name] = getattr(pygame, name)
Ça me semble vraiment pas mal comme solution.
Pour ce qui est de la pollutions de l'espace de nommage, ça me semble assez correct dans mon cas. Il me semble en effet que la notation 'K_*' soit réservée dans pygame aux constantes d'identification des touches. Il en est de même dans mon paquetage masquant pygame.
-- [...] en prenant l'argent des pauvres et en le donnant aux riches, nous stimulons l'effort et, partant, l'économie - John Kenneth Galbraith -
> import pygame
for name in dir(pygame):
if name.startswith("K_"):
globals()[name] = getattr(pygame, name)
Ça me semble vraiment pas mal comme solution.
Pour ce qui est de la pollutions de l'espace de nommage, ça me semble
assez correct dans mon cas. Il me semble en effet que la notation 'K_*'
soit réservée dans pygame aux constantes d'identification des touches.
Il en est de même dans mon paquetage masquant pygame.
--
[...] en prenant l'argent des pauvres et en le donnant aux riches, nous
stimulons l'effort et, partant, l'économie
- John Kenneth Galbraith -
> import pygame for name in dir(pygame): if name.startswith("K_"): globals()[name] = getattr(pygame, name)
Ça me semble vraiment pas mal comme solution.
Pour ce qui est de la pollutions de l'espace de nommage, ça me semble assez correct dans mon cas. Il me semble en effet que la notation 'K_*' soit réservée dans pygame aux constantes d'identification des touches. Il en est de même dans mon paquetage masquant pygame.
-- [...] en prenant l'argent des pauvres et en le donnant aux riches, nous stimulons l'effort et, partant, l'économie - John Kenneth Galbraith -