33---------
44"""
55from collections import defaultdict
6- from functools import wraps
7- import inspect
86from operator import attrgetter , itemgetter
97from textwrap import dedent
108from weakref import WeakKeyDictionary
119
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
1413from .functional import complement , keyfilter , valfilter
1514from .typecheck import compatible
1615from .typed_signature import TypedSignature
@@ -75,9 +74,7 @@ def _conflicting_defaults(typename, conflicts):
7574 {interfaces}"""
7675 ).format (
7776 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 ))),
8178 )
8279 return InvalidImplementation (message )
8380
@@ -108,6 +105,12 @@ def __new__(mcls, name, bases, clsdict):
108105 if isinstance (v , default ):
109106 defaults [k ] = v
110107
108+ warn_if_defaults_use_non_interface_members (
109+ name ,
110+ defaults ,
111+ set (signatures .keys ())
112+ )
113+
111114 clsdict ['_signatures' ] = signatures
112115 clsdict ['_defaults' ] = defaults
113116 return super (InterfaceMeta , mcls ).__new__ (mcls , name , bases , clsdict )
@@ -284,7 +287,7 @@ def __new__(mcls, name, bases, clsdict, interfaces=empty_set):
284287 errors = []
285288 default_impls = {}
286289 default_providers = defaultdict (list )
287- for iface in newtype .interfaces ():
290+ for iface in sorted ( newtype .interfaces (), key = getname ):
288291 try :
289292 defaults_from_iface = iface .verify (newtype )
290293 for name , impl in defaults_from_iface .items ():
@@ -306,7 +309,7 @@ def __new__(mcls, name, bases, clsdict, interfaces=empty_set):
306309 elif len (errors ) == 1 :
307310 raise errors [0 ]
308311 else :
309- raise InvalidImplementation ("\n \n " .join (map (str , errors )))
312+ raise InvalidImplementation ("\n " .join (map (str , errors )))
310313
311314 def __init__ (mcls , name , bases , clsdict , interfaces = empty_set ):
312315 mcls ._interfaces = interfaces
@@ -372,7 +375,7 @@ def implements(*interfaces):
372375 ordered_ifaces = tuple (sorted (interfaces , key = getname ))
373376 iface_names = list (map (getname , ordered_ifaces ))
374377
375- name = "Implements{I }" .format (I = "_" .join (iface_names ))
378+ name = "Implements{}" .format ("_" .join (iface_names ))
376379 doc = dedent (
377380 """\
378381 Implementation of {interfaces}.
0 commit comments