danielgtaylor / danielgtaylor/python-betterproto

Dictionary representation improvement?

オープン
#252 コメント 0 件 リアクション 5 件 担当者 0 名 GitHub で見る
enhancement
主要言語
Python
スター
1.8k
フォーク
234
PR マージ指標
30日以内にマージされた PR はありません

説明

Is there a better way to represent this dictionary into a `Struct()`? (Currently using 2.0.0b3)

```python
capability_dict = {"@context": "https://w3id.org/security/v2",
"target": "urn:trinsic:wallets:noop",
"proof": {
"created": datetime.datetime.now()
}
}
```
The following does work, but seems pretty kludgy:
```python
proof = Struct()
proof.fields["created"] = Value(string_value=str(datetime.datetime.now()))
capability = Struct()
capability.fields["@context"] = Value(string_value="https://w3id.org/security/v2")
capability.fields["target"] = Value(string_value="urn:trinsic:wallets:noop")
capability.fields["proof"] = Value(struct_value=proof)
```

* It seems to me that we could/should at least have a `Struct.from_dictionary(obj: dict)` method. I'd be happy to write this if it doesn't exist.
* `Struct.from_dict()` does NOT work for this, tested.

Example code of what I'm thinking:
```python
def value_to_proto_value(obj: Any) -> Value:
value = Value()
if isinstance(obj, str) or isinstance(obj, datetime.datetime):
value = Value(string_value=str(obj))
elif isinstance(obj, int) or isinstance(obj, float):
value = Value(number_value=float(obj))
elif isinstance(obj, bool):
value = Value(bool_value=obj)
elif isinstance(obj, dict):
value = Value(struct_value=dictionary_to_struct(obj))
elif isinstance(obj, list):
value = Value(list_value=list_to_proto_list(obj))

return value

def list_to_proto_list(obj: List) -> ListValue:
return ListValue(values=[value_to_proto_value(item) for item in obj])

def dictionary_to_struct(obj: Dict[str, Any]) -> Struct:
return Struct(fields=dict([(k, value_to_proto_value(v)) for k, v in obj.items()]))
```

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

まず Struct、Value、ListValue の定義を見つけ、Struct.from_dict() が示されたネストされた辞書を処理できない理由を調査します。ネストされた辞書、リスト、文字列、数値、ブール値、datetime 値について、意図された変換動作を確認します。例の表現をカバーする、合意された使いやすい API が得られれば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
python
領域
developer-experience
issue の種類
機能追加
難易度
5/5
見積もり時間
1週間以上
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
30/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。