0
votes

Meilleur moyen pythonique de vérifier si un paramètre est passé dans une fonction ou non? La vérification en ligne est-elle possible?

Je crée une fonction simple pour envoyer des mails avec mutt. Parfois, j'aurai besoin d'envoyer des pièces jointes et parfois non, donc je dois vérifier si le paramètre «pièce jointe» contient quelque chose. Pour le moment, mon code ressemble à ceci:

def sendMail(destino,asunto,cuerpo,adjunto):
    try:
        os.system('echo "' + cuerpo + '" | mutt -s "' + asunto + '" ' + destino)

Comment serait la bonne façon de vérifier si "adjunto" (variable de pièce jointe) contient quelque chose et d'ajouter "-a adjunto" à la commande uniquement s'il y a une pièce-jointe? Je sais que je pourrais faire une instruction "if" régulière et utiliser un os.system différent si j'ai une pièce jointe, mais je veux savoir s'il y a un moyen de faire cette vérification en ligne. Quelque chose comme "..... asunto + '"' + destino (('+' + adjunto) if adjunto = true) "

PS: Je sais que le code n'est toujours pas terminé, mais je veux pour savoir comment vérifier efficacement les pièces jointes.


4 commentaires

Profitez de votre injection de coquille.


@melpomene pourriez-vous s'il vous plaît élaborer?


Mon adresse e-mail est "rm -rf /;@p0wned.com . ;-)


@KlausD. merci, le code n'est toujours pas fini, je voulais juste connaître la partie "vérification des pièces jointes".


4 Réponses :


0
votes

Vous pouvez utiliser la valeur par défaut pour adjunto, vous le faites lors de la définition de la fonction comme ceci:

os.system('echo "{}" | mutt -s "{}" {}'.format(cuerpo, asunto, destino)

Vous pouvez également utiliser le hack de langage avec la commande or:

adjunto=None
print(adjunto or 'a')

Output:
    a

Cela n'ajoutera rien à la chaîne de votre injection.

Btw vous devriez utiliser ''. format , c'est beaucoup plus pythonique.

def sendMail(destino, asunto, cuerpo, adjunto=None):
    try:
        os.system('echo "' + cuerpo + '" | mutt -s "' + asunto + '" ' + destino)


0 commentaires

0
votes

Vous pouvez le faire de cette façon:

destino + ((" " + adjunto) if adjunto else "")

mais vous ne devriez probablement pas, sauf si vous êtes très sûr que le nom de la pièce jointe est vraiment un nom de fichier et non une commande shell malveillante. Et pensez à utiliser le module subprocess au lieu de os.system.


0 commentaires

0
votes

Vous pouvez utiliser une instruction if sur une ligne en Python: output if condition else other_output

Cela ressemblerait à ceci pour votre exemple:

    adjunto = '-a {}'.format(adjunto) if adjunto != None else ''
    os.system('echo "' + cuerpo + '" | mutt -s "' + adjunto + '" ' + destino)


1 commentaires

au lieu de ! = None , vous devriez dire que n'est pas None . Voir stackoverflow.com/q/14247373/2311167



0
votes
def sendMail(destino,asunto,cuerpo,adjunto = None):
    adjunto_mandato = ' -a ' + adjunto if adjunto is not None else ''
    mandato = 'echo "' + cuerpo + '" | mutt -s "' + asunto + '" ' + destino + adjunto_mandato

    try:
        os.system(mandato)
    except Exception as e:
        print(e)
This is the most stimple "Inline" way that I can think of to accomplish what you are asking. I supose you need to balance being able to read your code and have it inline because if you drop the Try block which you shouldn't do you could do the system call in a ternary operator:os.system() if adjunto is not None else os.system()buenos suerte! 

0 commentaires