【问题标题】:How to define nested class constants?如何定义嵌套类常量?
【发布时间】:2018-04-28 17:00:29
【问题描述】:

我在constants.py 中定义了这些常量

PERMISSION_USER_ADD = 'add_user'
PERMISSION_USER_VIEW = 'view_user'
PERMISSION_USER_EDIT = 'edit_user'
PERMISSION_TOOL_ADD = 'add_tool'
PERMISSION_TOOL_VIEW = 'view_tool'
PERMISSION_TOOL_EDIT = 'edit_tool'

但我不想在每次需要添加另一个时都输入这些完整的常量名称。

来自 Java 我可以做到这一点。

class Permission {
    class User {
        const ADD = 'add_user';
        const VIEW = 'view_user';
        const EDIT = 'edit_user';
    }
    class Tool {
        const ADD = 'add_tool';
        const VIEW = 'view_tool';
        const EDIT = 'edit_tool';
    }
}

但所有 python linters 都将其标记为糟糕的编码习惯,并且到目前为止,寻找 python 方法来做到这一点还没有取得成果。

所以我的问题是:以支持轻松重构的方式定义嵌套常量的 Python 方式是什么?

【问题讨论】:

  • 一个简单的字典不会删掉它?
  • 你还需要Permission.User.ADD吗?我看不出你是如何节省时间的。如果您对此感到担心,请给常量起更短的名称或将您的编辑器配置为自动完成。
  • @palivek 字典可以工作,但我必须使用 ['user']['add'] 来访问这些值。不确定这是否是最好的方法
  • @PatrickHaugh 如果我要添加新权限,我将不得不复制编辑/键入它,而使用嵌套我可以将它添加到一个地方。我也失去了很好地迭代权限的能力。再说一次,这可能只是我的偏见。

标签: java python constants


【解决方案1】:

您可以使用argparse.Namespace 来访问成员,就像您的班级示例一样:

>>> permissions = Namespace(
...     user=Namespace(add='add_user', etc),
...     etc
... )

然后:

>>> permissions.user.add
'add_user' 

【讨论】:

    【解决方案2】:

    字典可能是最简单的方法。

    class Permission(object):
        user = {
            'add': 'add_user',
            'view': 'view_user',
            'edit': 'edit_user',
        }
        tool = {
            'add' : 'add_tool',
            'view' : 'view_tool',
            'edit' : 'edit_tool',
        }
    
    print(Permission.user['view'])
    print(Permission.tool['view'])
    

    输出:

    view_user
    view_tool
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-26
      • 2012-05-04
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 2015-05-17
      • 1970-01-01
      相关资源
      最近更新 更多