Résolue

Fâché avec les f-strings ! 😠

# Chaînes de caractères # Fonctions # Orienté objet

Hello la team!


Etant un petit peu en froid avec les f-strings depuis ce matin, j'aurais besoin de vous pour nous réconcilier svp!

Notre désaccord?

Lorsque j'ai besoin de passer un argument à une fonction, j'utilise lorsque c'est nécessaire les f-strings. Problème: une fois que j'utilise les f-strings, j'envoie alors comme argument une chaîne de caractères au lieu d'autre chose.

Dans le cas d'une liste, j'ai vu avec Thierry et ai donc mis mes f-strings entre crochets [ ].

Pour un dictionnaire, je suppose qu'il faut utiliser les accolades?

Mais comment faire dans le cas d'un objet?


En gros, j'ai l'objet nommé `mon_objet`.

Comment faire pour le passer dans ma fonction `afficher_objet(mon_objet)` avec des f-strings? Par exemple:

pronom = 'mon'
def afficher_objet(objet: object):
    ...

afficher_objet(f'{pronom}_objet')


Merci d'avance pour votre aide!

Jean-Baptiste Baillet

d'après ce que j'ai compris, il faudrait d''abord créer une classe, afin de créer ton objet. ex:

class MonObjet:

def __init__(self, name) -> None:

self.name=name

self.affichage_objet=self.afficher_objet(self.name)

def afficher_objet(self):

return f'mon {self.name}'

def __str__(self) -> str:

return self.affichage_objet

Bonjour Jean-Baptiste!


Merci pour ton retour.

Mais en fait, mon soucis n'est pas de l'instanciation.

J'essaie d'expliquer mieux ci-dessous.

>>> class NouvelAmi:
...     def __init__(self, name):
...         self.name = name
...
>>> role = 'ami'
>>> mon_ami = NouvelAmi(name='toto')
>>>
>>> type(mon_ami)
<class '__main__.NouvelAmi'>
>>> type(f'mon_{role}')
<class 'str'>
>>> print(f'mon_{role}')
mon_ami



En gros, si j'utilise une fonction qui attend pour argument une instance de la classe NouvelAmi, je peux lui passer directement mon_ami.

En revanche, si je ne peux pas (ou ne veux pas) mettre en dur mon_ami comme argument et souhaite à la place utiliser les f-strings pour passer des arguments de façon dynamiques, je lui passe alors une chaîne de charactères (en utilisant les f-strings) plutôt qu'une instance de la classe NouvelAmi. Et la fonction ne fonctionne alors plus car le type de l'argument n'est pas bon.

Hello, je débute, mais j'ai une idée :

si tu utilises la méthode spéciale __str__(self) ça fonctionne, c'est bien ça que tu veux faire ?


class NouvelAmi():
    def __init__(self, name):
        self.name = name
    
    def __str__(self) -> str:
        return self.name

role = 'ami'
mon_ami = NouvelAmi(name='toto')
print(mon_ami)

Thibault houdon

Mentor

Salut David,

J'ai mis du temps à comprendre ce que tu souhaitais faire, je pense avoir compris, mais je ne vois pas trop de cas de figure dans lesquels ça serait utile.


En fait tu as une valeur stockée dans une variable "mon_objet" et tu souhaites passer cette variable à ta fonction. Mais le nom de cette variable doit être construit à partir d'un f-string. Du coup effectivement si tu construis le nom de ton objet sous forme d'un f-string, tu enverras la chaîne de caractères et non pas l'objet en question.


Il faudrait donc pouvoir récupérer ton objet via une chaîne de caractères, ce qui est possible en utilisant la fonction globals qui te permet d'accéder à tous les objets dans l'espace global de ton script :


def afficher_objet(objet: object):
    print(objet)

mon_objet = 3
pronom = 'mon'
afficher_objet(objet=globals()[f"{pronom}_objet"])


Si on fait un print de globals() tu vas voir qu'on récupère tout ce qui est défini dans l'espace global de ton script :


{'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fea0802cca0>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/thibh/Downloads/main 2.py', '__cached__': None, 'mon_objet': 3, 'pronom': 'mon', 'afficher_objet': <function afficher_objet at 0x7fe9e8038040>}


Est-ce que c'est ce que tu cherchais à faire ? Ça fonctionne ainsi, mais comme je te disais je ne vois pas vraiment de cas de figure dans lequel tu aurais besoin de faire ça. Si tu nous explique pourquoi tu cherches à faire ça, on pourra probablement t'aiguiller sur la façon plus optimale de faire ce que tu souhaites ;)

Salut Thibault !

Effectivement, tu as compris ce que j’ai eu beaucoup de mal à formuler ! 😁

J’ai vu également l’utilisation de globals.

Mais effectivement, j’étais parti sur un cas d’usage un peu trop tordu ! La logique de mon code n’était pas bonne.

J’ai donc tout revu.


Merci!

Inscris-toi

(c'est gratuit !)

Inscris-toi

Tu dois créer un compte pour participer aux discussions.

Créer un compte

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.