Skip to content
Merged
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 23 additions & 13 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ This project exists because I am unhappy with the state of the official Google p
- Uses `SerializeToString()` rather than the built-in `__bytes__()`
- Special wrapped types don't use Python's `None`
- Timestamp/duration types don't use Python's built-in `datetime` module

This project is a reimplementation from the ground up focused on idiomatic modern Python to help fix some of the above. While it may not be a 1:1 drop-in replacement due to changed method names and call patterns, the wire format is identical.

## Installation
Expand Down Expand Up @@ -126,7 +125,7 @@ Greeting(message="Hey!")

The generated Protobuf `Message` classes are compatible with [grpclib](https://github.com/vmagamedov/grpclib) so you are free to use it if you like. That said, this project also includes support for async gRPC stub generation with better static type checking and code completion support. It is enabled by default.

Given an example like:
Given an example service definition:

```protobuf
syntax = "proto3";
Expand All @@ -153,22 +152,33 @@ service Echo {
}
```

You can use it like so (enable async in the interactive shell first):

A client can be implemented as follows:
```python
>>> import echo
>>> from grpclib.client import Channel
import echo
from grpclib.client import Channel
import asyncio
Comment thread
theunkn0wn1 marked this conversation as resolved.
Outdated

>>> channel = Channel(host="127.0.0.1", port=1234)
>>> service = echo.EchoStub(channel)
>>> await service.echo(value="hello", extra_times=1)
EchoResponse(values=["hello", "hello"])

>>> async for response in service.echo_stream(value="hello", extra_times=1)
async def main():
channel = Channel(host="127.0.0.1", port=50051)
service = echo.EchoStub(channel)
print(await service.echo(value="hello", extra_times=1))
Comment thread
theunkn0wn1 marked this conversation as resolved.
Outdated

async for response in service.echo_stream(value="hello", extra_times=1):
print(response)

EchoStreamResponse(value="hello")
EchoStreamResponse(value="hello")
# don't forget to close the channel when done!
channel.close()
loop = asyncio.get_event_loop()
loop.run_until_complete(main())

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
if __name__ == '__main__':
asyncio.run(main())

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i specifically didn't use asyncio.run (cause of second commit) as It is introduced into the standard library as of python 3.7, since this library targets >= 3.6 this method cannot be used without breaking in that older interpreter.

Moving the runtime into a entry point check, however, is a good idea.

```

which would output
```python
EchoResponse(values=['hello', 'hello'])
EchoStreamResponse(value='hello')
EchoStreamResponse(value='hello')
```

### JSON
Expand Down