小编thi*_*nck的帖子

用 Python 枚举表示复杂对象

我正在使用一个基于图形的框架,该框架由多种类型的节点和关系组成。每种类型都有一些我希望能够轻松访问的元属性。为了表示这些类型,我认为枚举是最好的选择。

我对 Python 还比较陌生,但我知道 Java 等其他语言的枚举。我想这个问题实际上可以归结为Python 中枚举的使用是否合适。我这样代表我的类型:

class Grammar(Enum):
    VERB = 'verb'
    NOUN = 'noun'
# END Grammar

class _Word():
    def __init__(self, name, meta):
        self.name = name
        self.meta = meta
    # END __init__
# END _Word

class Word(Enum):
    TYPE_A = _Word('foo', Grammar.VERB)
    TYPE_B = _Word('bar', Grammar.NOUN)
# END Word
Run Code Online (Sandbox Code Playgroud)

因此,我的每个 Word 值都分配了一个 _Word 对象,这是一个复杂类型。这在大多数使用 Enum 的情况下都可以正常工作。然而,我的同事指出,Spyder 在检查存在枚举实例的对象时抛出异常:(ValueError(): is not a valid Word注意冒号后面的空格)。

这让我认为我使用枚举的方式不是最佳实践。我错过了什么吗?

python enums spyder

5
推荐指数
1
解决办法
4900
查看次数

如果传递了字符串,则新的Worker()将仅捆绑在一起

我正在尝试使用Web Worker在Angular 8应用程序中运行耗时的数据分析脚本,但是在捆绑该Worker时遇到了一些麻烦。我正在寻找帮助以找出我所缺少的东西。

我已使用Angular-CLI 8.0.2随附的示意图为我的项目生成了一个新工作线程:

ng g webWorker suggestions --project=my-project
Run Code Online (Sandbox Code Playgroud)

这会产生一个新的suggestions.worker.tstsconfig.worker.ts,并更新我的tsconfig.app.jsonangular.jsonpackage.json。这些对我来说看起来不错,但是如果需要,我可以提供详细信息。

我已将我移动suggestions.worker.ts到与实例化工作程序的服务相同的文件夹中。实例化工作程序的函数如下所示:

async calculateSuggestions<T>(
    data: T[]
): Promise<Suggestions<T>> {
    const worker = new Worker('./suggestions.worker', {
      type: 'module',
    });

    const result = new Promise((resolve, reject) => {
      worker.onmessage = ({ data }) => {
        resolve(data);
      };

      worker.onerror = ({ error }) => {
        reject(error);
      };
    }) as Promise<Suggestions<T>>;

    worker.postMessage({
      data: data
    });

    return result;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我构建项目时,出现以下警告和错误:

WARNING in new …
Run Code Online (Sandbox Code Playgroud)

web-worker typescript angular-cli angular

5
推荐指数
1
解决办法
610
查看次数

在Superset中使用OpenID/Keycloak

我想在Superset环境中使用keycloak对我的用户进行身份验证.

Superset使用flask-openid,如在flask-security中实现的:

要启用与常规用户身份验证(数据库)不同的用户身份验证,您需要覆盖superset_config.py文件中的AUTH_TYPE参数.您还需要提供对openid-connect领域的引用并启用用户注册.据我了解,它应该看起来像这样:

from flask_appbuilder.security.manager import AUTH_OID
AUTH_TYPE = AUTH_OID
OPENID_PROVIDERS = [
    { 'name':'keycloak', 'url':'http://localhost:8080/auth/realms/superset' }
]
AUTH_USER_REGISTRATION = True
AUTH_USER_REGISTRATION_ROLE = 'Gamma'
Run Code Online (Sandbox Code Playgroud)

使用此配置,登录页面将更改为用户可以选择所需OpenID提供程序的提示(在我们的示例中为keycloak).我们还有两个按钮,一个用于登录(对于现有用户),另一个用于注册为新用户.

我希望这些按钮中的任何一个都能带我到我的keycloak登录页面.但是,这不会发生.相反,我被重定向回到登录页面.

在我按下注册按钮的情况下,我收到一条消息"此刻无法注册您,请稍后再试".当我按下登录按钮时,不会显示任何消息.Superset日志显示加载登录页面的请求,但没有对keycloak的请求.我使用Google OpenID提供程序尝试了相同的操作,该工作正常.

由于我没有看到对keycloak的请求,这让我觉得我要么在某处丢失配置设置,要么我使用了错误的设置.你能帮我弄清楚我应该使用哪些设置吗?

python flask-security openid-connect keycloak apache-superset

2
推荐指数
1
解决办法
3189
查看次数

数据类对象属性别名

我正在做一个项目来了解有关使用 Python 的更多信息dataclasses。具体来说,我试图将 API 响应表示为一个dataclass对象。但是,由于 API 响应的结构,我遇到了一个问题。

以下是 API 的响应示例:

{
    "@identifier": "example",
    "@name": "John Doe",
}
Run Code Online (Sandbox Code Playgroud)

有些字段的名称中包含特殊字符。这意味着我无法直接映射 my 的属性dataclass,因为@属性名称中不允许使用特殊字符 ( SyntaxError)。

有没有办法为我的属性定义别名dataclass,以便我可以将 API 响应直接映射到dataclass对象?或者是否有必要先清理响应?

python python-dataclasses

2
推荐指数
1
解决办法
7822
查看次数

检查Python 2.7和3.x中的变量是int还是long

我希望对在Python 2.7及更高版本中运行的API函数进行输入类型检查.API将epoch作为参数,以毫秒为单位采用时间戳.我需要确保输入是正数.

根据值,Python 2.7将时间戳表示为a integer或a long.所以类型检查看起来像这样:

isinstance(timestamp, (int, long)) 
Run Code Online (Sandbox Code Playgroud)

但是,该long类型与intPython 3 合并.实际上,long类型不再存在.因此上述行会导致异常.相反,检查将如下所示:

isinstance(timestamp, int) 
Run Code Online (Sandbox Code Playgroud)

为了与Python 2.7兼容,我尝试将时间戳转换为int.但是,long如果值超出integer范围,则转换操作仍会返回a .这意味着检查将在之后的任何时间戳失败Sun Jan 25 1970 20:31:23.另见这个问题的答案.

在两个版本的Python中使用这个通用检查的最佳方法是什么?

python python-2.7 python-3.x

0
推荐指数
1
解决办法
1004
查看次数