2016-03-06 4 views
-1

Я хотел бы использовать Python's enum для создания значения в своем собственном пространстве имен.Специализированное перечисление пространства имен

Вот основная идея:

from enum import Enum 
class MyBaseNs(Enum): 
    __namespace__ = 'base' 

    a = 'a' 
    b = 'b' 

class MyChildNs(MyBaseNs): 
    __namespace__ = 'child' 

    a = 'a' 
    b = 'b' 

Затем каждый участник должен напечатать следующее:

>>> MyBaseNs.a.value 
'base.a' 
>>> MyBaseNs.b.value 
'base.b' 
>>> MyChildNs.a.value 
'base.child.a' 
>>> MyChildNs.a.value 
'base.child.b' 

Idealy, я хотел бы значение, которое будет принято непосредственно от имени элемента, так что я избегайте повторения, например, для примера Autoumber class.

И бонус будет иметь возможность сделать что-то вроде:

>>> MyBaseNs.child.a.value 
'base.child.a' 

Я начал играть с методом __new__(), но имеющие трудное время, чтобы достичь ожидаемого результата.

На данный момент у меня есть следующие:

from enum import Enum 

class MyNs(str, Enum): 
    __sep__ = '.' 

    def __new__(cls, value): 
     obj = str.__new__(cls) 
     obj._value_ = cls.__sep__.join(cls.__namespace__ + (str(value),)) 
     return obj 

class A(MyNs): 
    __namespace__ = ('a',) 

    a = 'a' 

Так это сделать str специализированную Enum и присоединиться к __namespace__ кортеж с каждым значением члена. Итак, это основа того, что я ищу.

Решение подразумевает запуск всех родителей текущего пространства имен для создания окончательного кортежа __namespace__. Я пока не вижу, как это можно сделать.

Как реализовать такое поведение? Enum действительно хороший способ пойти?

+1

* «С трудом» * не является полезным описанием проблемы; пожалуйста, дайте [mcve]. – jonrsharpe

ответ

0

Я не уверен, что вы пытаетесь достичь, и вот почему:

  • каждый модуль уже его собственное пространство имен
  • каждый класс уже его собственное пространство имен
  • много других вещей также уже пространств имен

Один (большой) трудности в использовании Enum так, как вы пытаетесь что Enum не позволяет подклассов раз члены существовать; другими словами, как только вы создали MyBaseNs в качестве Enum, вам не будет позволено создавать MyChildNs как Enum.


Что касается вашего кода; во время пробега Я получаю это:

>>> A 
<enum 'A'> 
>>> A.a 
<A.a: 'a.a'> 

Это похоже на то, о чем вы просили.

+0

Да, у меня есть основной код, но он заставляет вручную вводить иерархию пространства имен. Я бы хотел, чтобы это было более динамичным, чтобы не забывать о некоторых в случае рефакторизации. Это пространство имен и пространство имен приложения совершенно разные. Вот почему пространство имен модулей не является вариантом. – Spack

+0

@Spack: ваши 'MyBaseNs' и' MyChildNs' оба имеют одинаковые члены ('a' и' b') - это преднамеренный или просто плохой пример?Если преднамеренное, а дочерние пространства имен будут иметь одинаковые имена элементов, но разные значения, какова точка иерархии? –

Смежные вопросы