Conclusão de código e verificação de tipo para boto3

imagem


Imagem cortesia de anotações do tipo boto3, Allie Fitter


No momento, poucas pessoas escrevem grandes projetos Python sem anotação de tipo. É simples e permite que você consiga vários erros, mesmo na fase de escrever código, e funciona de maneira inteligente. Mas vale a pena adicionar boto3 à dependência e mypy começa a ficar cheio de mensagens que datilografam as anotações boto3não existem na natureza.


, 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-. ?


Como boto3muitos métodos e classes no mesmo arquivo são chamados de iguais, para a operação correta das anotações, o módulo se importa. Isso não funciona no Python 3.6.5 e não parece muito bom. Quais são as alternativas?


E, finalmente, se tudo estiver bem com C #, você poderá adicionar suporte literal a funções sobrecarregadas para o Python Language Server, para que tudo funcione de maneira imediata também no VSCode. Eu não pude e desisti.


Obrigado a todos!

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


All Articles