1
votes

Fonction Google Cloud en Python: TypeError: post_tweet () manquant 1 argument positionnel requis: 'context'

J'essaie de configurer une fonction Google Cloud qui reflète un référentiel github de script python. J'ai déjà implémenté avec succès la fonction sans mise en miroir github, mais pour une raison quelconque, lorsque je teste la fonction d'un projet dans lequel j'utilise la mise en miroir, j'obtiens l'erreur répertoriée dans le titre.

L'en-tête de méthode pour la fonction que j'appelle dans mon fichier main.py est ci-dessous:

def post_tweet(data, context):

J'ai le paramètre de context dans l'en-tête, donc je ne sais pas pourquoi il dit que je manque l'argument.

Edit: Comme demandé, voici le code complet.

import os
import sys
import tweepy

# source: https://www.cookieshq.co.uk/posts/how-to-build-a-serverless-twitter-bot-with-python-and-google-cloud
# docs: 
#  - https://cloud.google.com/functions/docs/env-var#functions_env_var_set-python
#  - https://cloud.google.com/functions/docs/writing/#functions-writing-helloworld-http-python

def setup_api():
    auth = tweepy.OAuthHandler(os.environ.get('CONSUMER_KEY'), os.environ.get('CONSUMER_SECRET'))
    auth.set_access_token(os.environ.get('ACCESS_TOKEN'), os.environ.get('ACCESS_TOKEN_SECRET'))
    return tweepy.API(auth)
def post_tweet(data, context):
    api = setup_api()
    tweet = 'Hello, world!'
    status = api.update_status(status=tweet)
    return 'Tweet Posted'

Edit 2: Pour clarifier, j'ai ce code exact qui fonctionne parfaitement bien lorsque j'utilise l'éditeur en ligne Google Cloud Function. L'erreur répertoriée dans le titre se produit uniquement lorsque j'utilise l'option de cloud source repository et que je la lie à un référentiel git.


4 commentaires

Comme erreur, post_tweet accepte deux arguments mais vous en avez transmis un. Veuillez ajouter le code complet pour une meilleure aide.


@Masoud Merci pour la suggestion. Le code complet est maintenant dans le post.


Il n'y a aucune utilisation des data et de l'argument de context dans votre fonction post_tweet .


Les data et les arguments de context sont requis pour une fonction Google Cloud. Les documents auxquels je fais référence sont liés dans les commentaires du code.


3 Réponses :


0
votes

En fait, je ne sais pas comment vous appelez la fonction, mais voici un exemple de travail basé sur votre exemple:

gcloud functions deploy post_tweet --region europe-west1 --memory=128MB --env-vars-file .env --runtime python37 --trigger-http

Ensuite, vous pouvez le déployer.

import os
import sys
import tweepy

# source: https://www.cookieshq.co.uk/posts/how-to-build-a-serverless-twitter-bot-with-python-and-google-cloud
# docs:
#  - https://cloud.google.com/functions/docs/env-var#functions_env_var_set-python
#  - https://cloud.google.com/functions/docs/writing/#functions-writing-helloworld-http-python

from dotenv import load_dotenv
load_dotenv()

def setup_api():
    auth = tweepy.OAuthHandler(os.environ.get(
        'CONSUMER_KEY'), os.environ.get('CONSUMER_SECRET'))
    auth.set_access_token(os.environ.get('ACCESS_TOKEN'),
                          os.environ.get('ACCESS_TOKEN_SECRET'))
    return tweepy.API(auth)


def post_tweet():
    api = setup_api()
    tweet = 'Hello, world!'
    status = api.update_status(status=tweet)
    return 'Tweet Posted'


if __name__ == "__main__":
    # just for checking if everything goes fine
    print(post_tweet())


4 commentaires

La fonction post_tweet n'a pas besoin d'être appelée dans le code. Les paramètres de la fonction Google Cloud sont configurés pour l'appeler lorsqu'elle est déclenchée.


De la manière pythonique, vous pouvez simplement appeler post_tweet () pour créer un nouveau tweet avec data message de data , et il semble que Google Cloud l'appelle sans aucun argument comme dans l'exemple original utilisé.


Je ne pense pas que cela résout mon problème. Lorsque je fais ce que vous faites et que je supprime les paramètres de post_tweet, j'obtiens l'erreur suivante lorsque je teste la fonction: post_tweet() takes 0 positional arguments but 1 was given


Il semble donc qu'il passe un argument à post_tweet() . Savez-vous quel est cet argument ou cet usage?



0
votes

Après avoir joué avec cela un peu plus, il semble que le paramètre de context n'est pas passé lors de la mise en miroir à partir d'un dépôt github. L'en-tête de la méthode ne doit accepter qu'un paramètre de data : def post_tweet(data):


0 commentaires

0
votes

Je pense que les paramètres requis dépendent de votre méthode d'invocation. Si vous utilisez Pub / Sub pour déclencher la fonction, vous avez besoin de def post_tweet(event, context): Cependant, si vous déployez avec un déclencheur HTTP, un seul paramètre est nécessaire: def post_tweet(request):


0 commentaires