2015-11-05 1 views
0

Je voudrais écrire par programmation une méthode qui appelle une méthode boto3 et modifier les paramètres par défaut dans les méthodes. Par exemple, je souhaite utiliser mon compartiment de journalisation si le journal est défini sur True. Sinon, ne le connectez pas. Quelque chose comme ceci:Valeurs par défaut pour les paramètres de la méthode boto3

def my_run(log=False): 
    log_string = "s3://mylogs" if log else None 

    result = emr.run_job_flow(Name = 'EMRTest1', 
           LogUri = log_string , 
           ... 
          ) 
    return result 

Ainsi, pour la valeur par défaut j'ai utilisé Aucun. Cependant, boto3 attend une chaîne. J'ai essayé la chaîne vide pour défaut et ce n'est pas une valeur valide

Je sais que si je ne spécifie pas logURI, il ne sera pas stocké. Donc, je pourrais le faire avec des instructions if, comme ceci:

def my_run(log=False): 
    if log: 
     result = emr.run_job_flow(Name = 'EMRTest1', 
            LogUri = "s3://mylogs" , 
            ... 
           ) 
    else: 
     result = emr.run_job_flow(Name = 'EMRTest1', 
            ... 
           ) 
    return result 

Mais c'est horrible. Et LogUri était juste un exemple. Je veux pouvoir changer d'autres paramètres. Je ne peux pas faire ces ifs imbriqués.

Y at-il une valeur par défaut pour divers types de chaînes comme boto3 que je peux utiliser?


Modifier 1

Dès le premier commentaire ci-dessous, http://boto3.readthedocs.org/en/latest/guide/events.html#provide-client-params

API intéressante. Pas bien documenté cependant. Leur exemple pour s3 clisnt fonctionne très bien,

s3 = boto3.client('s3') 

# Access the event system on the S3 client 
event_system = s3.meta.events 

# Create a function 
def add_my_bucket(params, **kwargs): 
    print "Hello" 
    # Add the name of the bucket you want to default to. 
    if 'Bucket' not in params: 
     params['Bucket'] = 'mybucket' 

# Register the function to an event 
event_system.register('provide-client-params.s3.ListObjects', add_my_bucket) 

response = s3.list_objects() 

alors la réponse est bonne et je vois aussi "Bonjour" imprimé.

Mais maintenant, je tente de faire un exemple pour le run_job_flow de RME:

def my_run(name): 
    def setName(params, **kwargs): 
     print "Hello" 
     params['Name'] = name 

    current_emr = boto3.client('emr') 
    event_system = current_emr.meta.events 

    event_system.register('provide-client-params.emr.RunJobFlow', setName) 

    current_emr.run_job_flow(...) 

Quand je cours, j'obtiens: manquant paramètre requis en entrée: « Nom »

Suis-je utiliser une syntaxe erronée en quelque sorte? J'ai utilisé RunJobFlow que j'ai reçu de current_emr.meta.method_to_api_mapping Peut-être que ce n'est pas provide-client-params pour emr?

Je vois ne pas non plus « Bonjour » imprimé

Répondre

0

Il n'y a pas de valeurs par défaut, sauf celles spécifiées de service, auquel cas nous envoyons tout simplement rien du tout. Si vous souhaitez modifier les paramètres lors de l'exécution, vous pouvez vous connecter au système d'événements. Vous pouvez lire à ce sujet here. Les exemples sont assez proches de ce que je pense que vous voulez faire.