Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

import selectif

6 réponses
Avatar
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

6 réponses

Avatar
Bruno Desthuilliers
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.
Avatar
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 :(
Avatar
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
Avatar
Michel Claveau - MVP
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
Avatar
Amaury Forgeot d'Arc
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_'))




@+


Avatar
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 -