2015-07-30 2 views
0

je vis les messages SO suivants sur des arguments variables en Python:Comment combiner des arguments connus et des arguments variables pour les transmettre à une autre fonction?

What does ** (double star) and * (star) do for parameters?
function call with named/unnamed and variable arguments in python
Can a variable number of arguments be passed to a function?

Aucun d'entre eux a répondu à ma question. Alors, voilà:

Je voudrais définir deux fonctions:

def LogError(log_file, *args): 
    print("USER ERROR:", ***NOT SURE ABOUT THIS PART***, file=log_file) 

def LogWarning(log_file, *args): 
    print("USER WARNING:", ***NOT SURE ABOUT THIS PART***, file=log_file) 

Je veux les appeler à l'aide:

error_file = open("somefile") 
LogError(error_file, "Unable to find", username, "in the database.") 

warning_file = open("somefile") 
LogWarning(warning_file, arg1, arg2, arg3) 

Je veux l'appel à LogError être l'équivalent de

print("USER ERROR:", "Unable to find", username, "in the database.", file=error_file) 

et je veux l'appel à LogWarning être l'équivalent de

print("USER WARNING:", arg1, arg2, arg3, file=warning_file) 

Quelle est la meilleure façon d'y parvenir?

+1

Puisqu'il n'y a pas d'autres arguments à l'appel, 'print (" USER ERROR: ", * args, file = fichier_journal)'? (En supposant Python 3) –

+0

@JeffMercado, j'ai essayé ça. Cela équivaut à 'print (" USER ERROR: ", [" Impossible de trouver ", nom d'utilisateur," dans la base de données. "], Fichier = fichier_erreur)'. –

+0

Le '*' est important. Il développera 'args' comme si la fonction était appelée avec les éléments comme arguments individuels dans leurs positions correspondantes. –

Répondre

2

Le premier lien que vous avez devrait fournir la réponse

def LogError(log_file, *args): 
    print("USER ERROR:", *args, file=log_file) 

def LogWarning(log_file, *args): 
    print("USER WARNING:", *args, file=log_file) 

qui élargirait les arguments que vous le souhaitez. Mais au lieu d'élaborer votre propre solution, vous devriez jeter un oeil à python's built in logging feature à la place.

+0

J'ai dû faire quelque chose d'étrange pendant les tests. Je pensais que j'avais essayé et ça ne semblait pas fonctionner. Cela fonctionne maintenant :) –

0

Il suffit de les joindre à un espace, puisque c'est le résultat final de toute façon:

print('USER ERROR: {}'.format(' '.join(*args)), file=error_file) 

Vous vraiment devriez utiliser le logging module, ce qui rendra la vie plus facile:

import logging 

# Create a logger 
log = logging.getLogger(__file__) 

# Set the output for different log levels 
# this is optional, you can write out all errors to the 
# console and do many combinations, such as sending emails 

warning_logger = logging.FileHandler('warnings.log') 
warning_logger.setLevel(logging.WARNING) 

error_logger = logging.FileHandler('error.log') 
error_logger.setLevel(logging.ERROR) 

# Set the format of messages 
# levelname will be WARNING or ERROR depending on the message 
log_format = logging.Formatter('USER %(levelname)s: %(message)s') 

# Set the formatters for the error loggers 
warning_logger.setFormatter(log_format) 
error_logger.setFormatter(log_format) 

# Add the handlers to the master logger instance 
log.addHandler(warning_logger) 
log.addHandler(error_logger) 

# Now all you need is 

log.warn('This is a warning') 
log.error('This is a error') 

Pour plus de détails consultez le logging module documentation et pour plus de recettes, le logging module cookbook vaut le détour.

+0

Bien que cela puisse fonctionner dans ce cas précis, cela ne fonctionnerait pas pour les appels de fonction en général. –

+0

Merci pour le pointeur. Je vais certainement examiner cela. –