graphql-python / graphql-python/graphene
Circular import solution
- Langage dominant
- Python
- Étoiles
- 8.2k
- Forks
- 818
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Description
I would like to contribute a solution to the circular import problem. As far as I can see, currently this problem has some workaround through the `Dynamic` type:
https://github.com/graphql-python/graphene/issues/522#issuecomment-626075061
From my point of view strategy described in this link is pretty much elegant, since it uses `type` argument from Scheme constructor, which has relevant description:
```
types (List[GraphQLType], optional): List of any types to include in schema that
may not be introspected through root types.
```
But instead of creating new types and making syntax even more complicated and non-readable, I would like to propose a solution with schema pushing down to the `import_string` method from utils.
Apparently, it was not difficult task:
I made fast and simple changes in interfaces, in order to do this:
Changed `type` method interface of `Field` class:
```python
def type(self, schema):
return get_type(self._type, schema)
```
Then reducer invocation [here](https://github.com/graphql-python/graphene/blob/e24ac547d670d90931cc2392d2330787747c041f/graphene/types/schema.py#L299) :
```python
def construct_fields_for_type(self, map, type, is_input_type=False):
fields = OrderedDict()
for name, field in type._meta.fields.items():
if isinstance(field, Dynamic):
field = get_field_as(field.get_type(self.schema), _as=Field)
if not field:
continue
map = self.reducer(map, field.type(self.schema))
field_type = self.get_field_type(map, field.type(self.schema))
```
Small changes for `get_type` method:
```python
def get_type(_type, schema=None):
if isinstance(_type, string_types):
return import_string(_type, schema=schema)
```
```python
def import_string(type_name, dotted_attributes=None, schema=None):
if schema:
try:
scheme_type = next(type_ for type_ in schema.types if type_._meta.name == type_name)
return scheme_type
except StopIteration:
pass
....
```
At the end of a day I was able to run code from [link](https://github.com/graphql-python/graphene/issues/522#issuecomment-626075061) without problems.
```python
from graphene import ObjectType, List
class FooBarBaz(ObjectType):
foo_bars = List('FooBar', required= True)
```
It is a small fix, I made them with respect to my first impression of graphene structure.
Please, give me feedback, if this solution is okay for you, I will make a pull request.
If not, please, describe why and how can I then avoid circular import
Guide de contribution
Aucun guide de contribution indexé pour ce dépôt
Piste de recherche
Commencez par examiner graphene/types/schema.py autour de construct_fields_for_type ainsi que les méthodes get_type/import_string de utils, puis reproduisez l’exemple d’importation circulaire de la discussion liée. Le travail est terminé lorsqu’il a été déterminé si le fait de transmettre le schema résout l’exemple sans casser la résolution de types existante, et que la décision qui en résulte est documentée.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- api
- Type d'issue
- Bug
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100