# This file is dual licensed under the terms of the Apache License, Version# 2.0, and the BSD License. See the LICENSE file in the root of this repository# for complete details.from__future__importabsolute_import,division,print_functionimportsysPY2=sys.version_info[0]==2PY3=sys.version_info[0]==3# flake8: noqaifPY3:string_types=str,else:string_types=basestring,defwith_metaclass(meta,*bases):""" Create a base class with a metaclass. """# This requires a bit of explanation: the basic idea is to make a dummy# metaclass for one level of class instantiation that replaces itself with# the actual metaclass.classmetaclass(meta):def__new__(cls,name,this_bases,d):returnmeta(name,bases,d)returntype.__new__(metaclass,'temporary_class',(),{})