Complétion de code et vérification de type pour boto3

image


Image gracieuseté des annotations de type boto3, Allie Fitter


À l'heure actuelle, peu de gens écrivent de grands projets Python sans annotation de type. C'est simple et vous permet de détecter un tas d'erreurs même au stade de l'écriture de code, et cela fonctionne très intelligemment. Mais cela vaut la peine d'ajouter boto3 en tant que dépendance , et mypy commence à être plein de messages indiquant que les annotations de type boto3n'existent pas dans la nature.


, boto3 botostubs. , mypy .


boto3-type-annotations, , mypy .


boto3, ?


mypy


, boto3 1.11.9 EC2, DynamoDB S3. Python 3.6.9 . , , boto3-stubs 1.11.9.x .


#   boto3 ,     
pip install boto3-stubs[s3,ec2,dynamodb]==1.11.9.0

#     pip, pipfile  poetry,
#    whl-,     
#   
python -m mypy_boto3

… ! mypy , , , boto3, .


- !


, .


VSCode , . boto3.client, boto3_session.client,boto3.resource, boto3_session.resource, client.get_waiter client.get_paginator.


PyCharm - , 15 , .


import boto3

from mypy_boto3 import dynamodb

#   ,    
client: dynamodb.DynamoDBClient = boto3.client("dynamodb")

# IDE        
client.query("my_table")


import boto3

from mypy_boto3 import s3

# PyCharm  mypy      ,   
client: s3.S3Client = boto3.client("s3")

# IDE   ,  ,  --
client.create_bucket(Bucket="bucket")

# ,   mypy     

# (mypy) error: Missing positional argument "Key" in call to "get_object" of "S3Client"
client.get_object(Bucket="bucket")

# (mypy) error: Argument "Key" to "get_object" of "S3Client" has incompatible type "None"; expected "str"
client.get_object(Bucket="bucket", Key=None)

resource: s3.S3ServiceResource = boto3.Session(region_name="us-west-1").resource("s3")

#   -     
bucket = resource.Bucket("bucket")

# (mypy) error: Unexpected keyword argument "key" for "upload_file" of "Bucket"; did you mean "Key"?
bucket.upload_file(Filename="my.txt", key="my-txt")

# waiter'   paginator'  
#         
waiter: s3.BucketExistsWaiter = client.get_waiter("bucket_exists")
paginator: s3.ListMultipartUploadsPaginator = client.get_paginator(
    "list_multipart_uploads"
)


mypy-boto3-builder - boto3. boto3, .


json- botocore , boto3 .



, , .


post-install , whl-. ?


Étant donné que de boto3nombreuses méthodes et classes dans le même fichier sont appelées les mêmes, pour le bon fonctionnement des annotations, le module s'importe lui-même. Cela ne fonctionne pas dans Python 3.6.5 et ne semble pas très bon. Quelles sont les alternatives?


Et enfin, si tout va bien avec C #, vous pouvez ajouter une prise en charge littérale aux fonctions surchargées pour le serveur de langage Python afin que tout fonctionne également en VSCode. Je n'ai pas pu et j'ai abandonné.


Merci à tous!

Source: https://habr.com/ru/post/undefined/


All Articles