Skip to content

Metaclass syntax is not py3k-compatible #2121

@wchargin

Description

@wchargin

Low-priority.

Our codebase assigns to __metaclass__ to set metaclasses, but this
only works in Python 2. The portable way is to use six.add_metaclass,
which works as a decorator. The following occurrences are broken in
Python 3:

$ git grep '__metaclass__ ='
tensorboard/backend/event_processing/db_import_multiplexer.py:  __metaclass__ = abc.ABCMeta
tensorboard/plugins/base_plugin.py:  __metaclass__ = ABCMeta
tensorboard/plugins/beholder/video_writing.py:  __metaclass__ = abc.ABCMeta
tensorboard/program.py:  __metaclass__ = ABCMeta

Demo:

$ cat /tmp/meta.py; echo
import abc


class Foo(object):
  __metaclass__ = abc.ABCMeta

  @abc.abstractmethod
  def foo(self):
    pass


Foo()  # should fail!

$ python2 /tmp/meta.py; echo $?
Traceback (most recent call last):
  File "/tmp/meta.py", line 12, in <module>
    Foo()  # should fail!
TypeError: Can't instantiate abstract class Foo with abstract methods foo
1
$ python3 /tmp/meta.py; echo $?
0

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions