import selectif

Le
Jogo
Bonjour,

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
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
Bruno Desthuilliers
Le #20536491
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.
Bruno Desthuilliers
Le #20544701
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
Le #20544621
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
Michel Claveau - MVP
Le #20545141
Bonsoir !

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 :


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_'))




@+
--
Michel Claveau
Amaury Forgeot d'Arc
Le #20550611
Bonsoir,

Michel Claveau - MVP a écrit :
Bonsoir !

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
Le #20559751
> 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 -
Publicité
Poster une réponse
Anonyme