googleapis / googleapis/google-cloud-python

Cryptic TypeError in proto-plus during assignment with invalid type

Open
#17,684 0 comments 0 reactions 0 assignees View on GitHub
priority: p3 type: docs
Dominant language
Python
Stars
5.4k
Forks
1.8k
Avg merge
3d 4h
Merged PRs (30d)
122

Description

### Determine this is the right repository

- [x] I determined this is the correct repository in which to report this bug.

### Summary of the issue

**Context:**
When setting a field on a protobuf message using proto-plus with an invalid type or structure, the underlying protocol buffer library fails during initialization or merging.

**Expected Behavior:**
proto-plus should catch the TypeError and re-raise it with a more descriptive message that includes the specific message class and field name, aiding in debugging type mismatches.

**Actual Behavior:**
The library raises a cryptic TypeError: bad argument type for built-in operation without any context about which field or message class caused the failure.

### API client name and version

proto-plus

### Reproduction steps: code

from google.cloud import dataproc_v1

def sample_create_batch():
batch = dataproc_v1.Batch()

# Provide a type that is not a string in the args list. args expects a MutableSequence[str]
batch.pyspark_batch.args = [1000]

sample_create_batch()

### Reproduction steps: supporting files

file: mydata.csv
```
alpha,1,3
beta,2,5
```

### Reproduction steps: actual results

Traceback (most recent call last):
File "test.py", line 42, in
sample_create_batch()
File "test.py", line 24, in sample_create_batch
batch.pyspark_batch.args = [1000 ]
File "/env/lib/python3.11/site-packages/proto/message.py", line 944, in __setattr__
self._pb.MergeFrom(self._meta.pb(**{key: pb_value}))
TypeError: bad argument type for built-in operation

### Reproduction steps: expected results

TypeError: Failed to set field 'args' on PysparkBatch with value [1000]. Underlying error: bad argument type for built-in operation.

### OS & version + platform

Linux (Google Cloud Shell) / macOS

### Python environment

Python 3.12

### Python dependencies

_No response_

### Additional context

The cryptic error is thrown directly from the underlying protocol buffers `MergeFrom` execution inside `proto/message.py`. Wrapping the initialization and `MergeFrom` calls in `try-except` blocks to provide contextual wrapper errors would greatly improve the developer experience.

Contributor guide

Open the contributing guide

Research direction

Start in proto/message.py at __setattr__ around the reported MergeFrom call, then trace the initialization and MergeFrom paths mentioned in the issue. Reproduce the sample assignment with batch.pyspark_batch.args = [1000] and verify that the resulting TypeError identifies the PysparkBatch message, the args field, and the invalid value.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
backend-api-design
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
72/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.