如何使嵌套枚举也具有值

问题描述 投票:2回答:3

请考虑以下代码示例:

from enum import Enum

class Location(Enum):
    Outside = 'outside'
    Inside = 'inside' 
    class Inside(Enum): # TypeError for conflicting names
        Downstairs = 'downstairs'
        Upstairs = 'upstairs'

我如何使Inside内部具有'inside'的值,同时又是用于访问楼下和楼上的嵌套枚举?

所需的输入:

print(Location.Inside)
print(Location.Inside.value)
print(Location.Inside.Downstairs)
print(Location.Inside.Downstairs.value)

所需的输出:

Location.Inside
inside
Location.Inside.Downstairs
downstairs

更新1:

关于我的特定问题的更多背景信息:

class Location(Enum):
    Outside = 'outside'
    Inside = 'inside' 
    class Inside(Enum): # TypeError for conflicting names
        Downstairs = 'downstairs'
        Upstairs = 'upstairs'

class Human:
    def __init__(self, location):
        self.location = location

def getLocationFromAPI():
    # this function returns either 'inside' or 'outside'
    # make calls to external API  
    return location # return location from api in str

def whereInside(human):
    if human.location != Location.Inside:
        return None
    # here goes logic that determines if human is downstairs or upstairs
    return locationInside # return either Location.Downstairs or Location.Upstairs


location_str = getLocationFromAPI() # will return 'inside' or 'outside'
location = Location(location_str) # make Enum
human = Human(location) # create human with basic location
if human.location == Location.Inside:
    where_inside = whereInside(human)
    human.location = where_inside # update location to be more precise

问题是,当我创建人类对象时,我只知道一个基本位置,如“内部”或“外部”。只有这样,我才能更精确地更新位置。

python python-3.x
3个回答
3
投票

您可以通过将enum.Enum嵌入到另一个对象中来完成此操作,例如:(只是注意名称冲突)]] >>

from enum import Enum

class _Inside(Enum):
    Downstairs = 'downstairs'
    Upstairs = 'upstairs'

class Location(Enum):
    Outside = 'outside'
    Inside = _Inside 

print(Location.Inside.value.Downstairs.value)
downstairs

from enum import Enum


# This is not Enum class
class Location(object):
    Outside = 'outside'
    Inside = 'inside'

    # This is Enum class
    class Inside(Enum):
        Downstairs = 'downstairs'
        Upstairs = 'upstairs'

        def __str__(self):
            return self.value


print(Location.Outside)  # output: outside
print(Location.Inside.Downstairs)  # output: downstairs

您没有缩进OutsideInside,但是此代码是不必要的。我建议使用dict,因为this video解释说,对于可以更简单地实现的事情而言,类使用得太多了。

locations = {'inside': {'downstairs': 'downstairs',
                        'upstairs': 'upstairs'},
             'outside': {'park': 'park'}
            }

这更有意义:

locations['inside']['downstairs']
#downstairs
locations['outside']['park']
#'park'

[Zen of Python指出:“简单胜于复杂。”

[如果是.dot表示法,那么您真正想要的就是Box。它不是很多人使用的东西,但是有些人真的更喜欢.dot表示法模式。


pip install python-box


from box import Box

loc_box = Box(locations)

loc_box.inside.upstairs
#'upstairs'

0
投票
from enum import Enum


# This is not Enum class
class Location(object):
    Outside = 'outside'
    Inside = 'inside'

    # This is Enum class
    class Inside(Enum):
        Downstairs = 'downstairs'
        Upstairs = 'upstairs'

        def __str__(self):
            return self.value


print(Location.Outside)  # output: outside
print(Location.Inside.Downstairs)  # output: downstairs

-1
投票

您没有缩进OutsideInside,但是此代码是不必要的。我建议使用dict,因为this video解释说,对于可以更简单地实现的事情而言,类使用得太多了。

locations = {'inside': {'downstairs': 'downstairs',
                        'upstairs': 'upstairs'},
             'outside': {'park': 'park'}
            }
© www.soinside.com 2019 - 2024. All rights reserved.