3
3
---------
4
4
"""
5
5
from collections import defaultdict
6
- from functools import wraps
7
- import inspect
8
6
from operator import attrgetter , itemgetter
9
7
from textwrap import dedent
10
8
from weakref import WeakKeyDictionary
11
9
12
- from .compat import raise_from , viewkeys , with_metaclass
13
- from .default import default # noqa reexport
10
+ from .compat import raise_from , with_metaclass
11
+ from .default import default , warn_if_defaults_use_non_interface_members
12
+ from .formatting import bulleted_list
14
13
from .functional import complement , keyfilter , valfilter
15
14
from .typecheck import compatible
16
15
from .typed_signature import TypedSignature
@@ -75,9 +74,7 @@ def _conflicting_defaults(typename, conflicts):
75
74
{interfaces}"""
76
75
).format (
77
76
attr = attrname ,
78
- interfaces = "\n " .join (sorted ([
79
- " - {name}" .format (name = iface .__name__ ) for iface in interfaces
80
- ]))
77
+ interfaces = bulleted_list (sorted (map (getname , interfaces ))),
81
78
)
82
79
return InvalidImplementation (message )
83
80
@@ -108,6 +105,12 @@ def __new__(mcls, name, bases, clsdict):
108
105
if isinstance (v , default ):
109
106
defaults [k ] = v
110
107
108
+ warn_if_defaults_use_non_interface_members (
109
+ name ,
110
+ defaults ,
111
+ set (signatures .keys ())
112
+ )
113
+
111
114
clsdict ['_signatures' ] = signatures
112
115
clsdict ['_defaults' ] = defaults
113
116
return super (InterfaceMeta , mcls ).__new__ (mcls , name , bases , clsdict )
@@ -284,7 +287,7 @@ def __new__(mcls, name, bases, clsdict, interfaces=empty_set):
284
287
errors = []
285
288
default_impls = {}
286
289
default_providers = defaultdict (list )
287
- for iface in newtype .interfaces ():
290
+ for iface in sorted ( newtype .interfaces (), key = getname ):
288
291
try :
289
292
defaults_from_iface = iface .verify (newtype )
290
293
for name , impl in defaults_from_iface .items ():
@@ -306,7 +309,7 @@ def __new__(mcls, name, bases, clsdict, interfaces=empty_set):
306
309
elif len (errors ) == 1 :
307
310
raise errors [0 ]
308
311
else :
309
- raise InvalidImplementation ("\n \n " .join (map (str , errors )))
312
+ raise InvalidImplementation ("\n " .join (map (str , errors )))
310
313
311
314
def __init__ (mcls , name , bases , clsdict , interfaces = empty_set ):
312
315
mcls ._interfaces = interfaces
@@ -372,7 +375,7 @@ def implements(*interfaces):
372
375
ordered_ifaces = tuple (sorted (interfaces , key = getname ))
373
376
iface_names = list (map (getname , ordered_ifaces ))
374
377
375
- name = "Implements{I }" .format (I = "_" .join (iface_names ))
378
+ name = "Implements{}" .format ("_" .join (iface_names ))
376
379
doc = dedent (
377
380
"""\
378
381
Implementation of {interfaces}.
0 commit comments