@@ -425,7 +425,7 @@ def resolve_type(self, value):
425
425
if isinstance(value, Cat):
426
426
return CatType()
427
427
"""
428
- __slots__ = 'name' , 'description' , '_resolve_type' , '_types' , '_possible_type_names'
428
+ __slots__ = 'name' , 'description' , '_resolve_type' , '_types' , '_possible_type_names' , '_possible_types'
429
429
430
430
def __init__ (self , name , types = None , resolve_type = None , description = None ):
431
431
assert name , 'Type must be named.'
@@ -437,28 +437,15 @@ def __init__(self, name, types=None, resolve_type=None, description=None):
437
437
assert callable (resolve_type ), '{} must provide "resolve_type" as a function.' .format (self )
438
438
439
439
self ._resolve_type = resolve_type
440
-
441
- assert isinstance (types , (list , tuple )) and len (types ) > 0 , 'Must provide types for Union {}.' .format (name )
442
- has_resolve_type_fn = callable (self ._resolve_type )
443
-
444
- for type in types :
445
- assert isinstance (type , GraphQLObjectType ), (
446
- '{} may only contain Object types, it cannot contain: {}.' .format (self , type )
447
- )
448
-
449
- if not has_resolve_type_fn :
450
- assert callable (type .is_type_of ), (
451
- 'Union Type {} does not provide a "resolve_type" function '
452
- 'and possible Type {} does not provide a "is_type_of" '
453
- 'function. There is no way to resolve this possible type '
454
- 'during execution.'
455
- ).format (self , type )
456
-
457
440
self ._types = types
441
+ self ._possible_types = None
458
442
self ._possible_type_names = None
459
443
460
444
def get_possible_types (self ):
461
- return self ._types
445
+ if self ._possible_types is None :
446
+ self ._possible_types = define_types (self , self ._types )
447
+
448
+ return self ._possible_types
462
449
463
450
def is_possible_type (self , type ):
464
451
if self ._possible_type_names is None :
@@ -475,6 +462,29 @@ def resolve_type(self, value, info):
475
462
return get_type_of (value , info , self )
476
463
477
464
465
+ def define_types (union_type , types ):
466
+ if callable (types ):
467
+ types = types ()
468
+
469
+ assert isinstance (types , (list , tuple )) and len (types ) > 0 , 'Must provide types for Union {}.' .format (union_type .name )
470
+ has_resolve_type_fn = callable (union_type ._resolve_type )
471
+
472
+ for type in types :
473
+ assert isinstance (type , GraphQLObjectType ), (
474
+ '{} may only contain Object types, it cannot contain: {}.' .format (union_type , type )
475
+ )
476
+
477
+ if not has_resolve_type_fn :
478
+ assert callable (type .is_type_of ), (
479
+ 'Union Type {} does not provide a "resolve_type" function '
480
+ 'and possible Type {} does not provide a "is_type_of" '
481
+ 'function. There is no way to resolve this possible type '
482
+ 'during execution.'
483
+ ).format (union_type , type )
484
+
485
+ return types
486
+
487
+
478
488
class GraphQLEnumType (GraphQLType ):
479
489
"""Enum Type Definition
480
490
0 commit comments