Skip to content

Commit 88dfaec

Browse files
google-labs-jules[bot]BenRKarl
authored andcommitted
Add type hints to examples/shopping_ads
This change adds type annotations to all Python files within the examples/shopping_ads directory. Type hints were added for function arguments, return values, class attributes, and local variables to improve code clarity, maintainability, and enable static analysis.
1 parent dd22fb9 commit 88dfaec

7 files changed

+1052
-478
lines changed

examples/shopping_ads/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Fully type-hinted

examples/shopping_ads/add_listing_scope.py

Lines changed: 63 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,43 @@
2929

3030
import argparse
3131
import sys
32+
from typing import Any, List
3233

3334
from google.ads.googleads.client import GoogleAdsClient
3435
from google.ads.googleads.errors import GoogleAdsException
35-
36-
37-
def main(client, customer_id, campaign_id):
38-
campaign_service = client.get_service("CampaignService")
39-
campaign_criterion_operation = client.get_type("CampaignCriterionOperation")
40-
campaign_criterion = campaign_criterion_operation.create
36+
from google.ads.googleads.v17.common.types.criteria import (
37+
ListingDimensionInfo,
38+
)
39+
from google.ads.googleads.v17.enums.types.product_custom_attribute_index import (
40+
ProductCustomAttributeIndexEnum,
41+
)
42+
from google.ads.googleads.v17.enums.types.product_type_level import (
43+
ProductTypeLevelEnum,
44+
)
45+
from google.ads.googleads.v17.resources.types.campaign_criterion import (
46+
CampaignCriterion,
47+
)
48+
from google.ads.googleads.v17.services.services.campaign_criterion_service import (
49+
CampaignCriterionServiceClient,
50+
)
51+
from google.ads.googleads.v17.services.services.campaign_service import (
52+
CampaignServiceClient,
53+
)
54+
from google.ads.googleads.v17.services.types.campaign_criterion_operation import (
55+
CampaignCriterionOperation,
56+
)
57+
58+
59+
def main(
60+
client: GoogleAdsClient, customer_id: str, campaign_id: str
61+
) -> None:
62+
campaign_service: CampaignServiceClient = client.get_service(
63+
"CampaignService"
64+
)
65+
campaign_criterion_operation: CampaignCriterionOperation = client.get_type(
66+
"CampaignCriterionOperation"
67+
)
68+
campaign_criterion: CampaignCriterion = campaign_criterion_operation.create
4169
campaign_criterion.campaign = campaign_service.campaign_path(
4270
customer_id, campaign_id
4371
)
@@ -47,39 +75,53 @@ def main(client, customer_id, campaign_id):
4775
# must be met for a product to be included in a campaign.
4876
# A typical listing scope might only have a few dimensions. This example
4977
# demonstrates a range of different dimensions you could use.
50-
dimensions = campaign_criterion.listing_scope.dimensions
78+
dimensions: List[ListingDimensionInfo] = (
79+
campaign_criterion.listing_scope.dimensions
80+
)
5181

52-
product_brand_dimension = client.get_type("ListingDimensionInfo")
82+
product_brand_dimension: ListingDimensionInfo = client.get_type(
83+
"ListingDimensionInfo"
84+
)
5385
product_brand_dimension.product_brand.value = "google"
5486
dimensions.append(product_brand_dimension)
5587

56-
product_custom_attribute_index_enum = (
88+
product_custom_attribute_index_enum: ProductCustomAttributeIndexEnum = (
5789
client.enums.ProductCustomAttributeIndexEnum
5890
)
59-
product_custom_attribute_dimension = client.get_type("ListingDimensionInfo")
91+
product_custom_attribute_dimension: ListingDimensionInfo = client.get_type(
92+
"ListingDimensionInfo"
93+
)
6094
product_custom_attribute = (
6195
product_custom_attribute_dimension.product_custom_attribute
6296
)
6397
product_custom_attribute.index = product_custom_attribute_index_enum.INDEX0
6498
product_custom_attribute.value = "top_selling_products"
6599
dimensions.append(product_custom_attribute_dimension)
66100

67-
product_type_level_enum = client.enums.ProductTypeLevelEnum
68-
product_type_dimension_1 = client.get_type("ListingDimensionInfo")
101+
product_type_level_enum: ProductTypeLevelEnum = (
102+
client.enums.ProductTypeLevelEnum
103+
)
104+
product_type_dimension_1: ListingDimensionInfo = client.get_type(
105+
"ListingDimensionInfo"
106+
)
69107
product_type = product_type_dimension_1.product_type
70108
product_type.level = product_type_level_enum.LEVEL1
71109
product_type.value = "electronics"
72110
dimensions.append(product_type_dimension_1)
73111

74-
product_type_dimension_2 = client.get_type("ListingDimensionInfo")
112+
product_type_dimension_2: ListingDimensionInfo = client.get_type(
113+
"ListingDimensionInfo"
114+
)
75115
product_type = product_type_dimension_2.product_type
76116
product_type.level = product_type_level_enum.LEVEL2
77117
product_type.value = "smartphones"
78118
dimensions.append(product_type_dimension_2)
79119

80-
campaign_criterion_service = client.get_service("CampaignCriterionService")
120+
campaign_criterion_service: CampaignCriterionServiceClient = (
121+
client.get_service("CampaignCriterionService")
122+
)
81123

82-
campaign_criterion_response = (
124+
campaign_criterion_response: Any = (
83125
campaign_criterion_service.mutate_campaign_criteria(
84126
customer_id=customer_id, operations=[campaign_criterion_operation]
85127
)
@@ -89,8 +131,8 @@ def main(client, customer_id, campaign_id):
89131
f"Added {len(campaign_criterion_response.results)} campaign "
90132
"criteria:"
91133
)
92-
for campaign_criterion in campaign_criterion_response.results:
93-
print(campaign_criterion.resource_name)
134+
for criterion in campaign_criterion_response.results:
135+
print(criterion.resource_name)
94136

95137

96138
if __name__ == "__main__":
@@ -108,11 +150,13 @@ def main(client, customer_id, campaign_id):
108150
parser.add_argument(
109151
"-i", "--campaign_id", type=str, required=True, help="The campaign ID."
110152
)
111-
args = parser.parse_args()
153+
args: argparse.Namespace = parser.parse_args()
112154

113155
# GoogleAdsClient will read the google-ads.yaml configuration file in the
114156
# home directory if none is specified.
115-
googleads_client = GoogleAdsClient.load_from_storage(version="v20")
157+
googleads_client: GoogleAdsClient = GoogleAdsClient.load_from_storage(
158+
version="v20"
159+
)
116160

117161
try:
118162
main(googleads_client, args.customer_id, args.campaign_id)

0 commit comments

Comments
 (0)