小编Ric*_*ica的帖子

如何使__slots__更好地使用数据类?

它决定除去直接支持__slots__从数据类为Python 3.7。

尽管如此,__slots__仍可以与数据类一起使用:

from dataclasses import dataclass

@dataclass
class C():
    __slots__ = "x"
    x: int
Run Code Online (Sandbox Code Playgroud)

但是,由于这种方式__slots__有效,因此无法为数据类字段分配默认值:

from dataclasses import dataclass

@dataclass
class C():
    __slots__ = "x"
    x: int = 1
Run Code Online (Sandbox Code Playgroud)

这会导致错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 'x' in __slots__ conflicts with class variable
Run Code Online (Sandbox Code Playgroud)

如何__slots__与默认dataclass字段一起使用?

python slots python-3.x python-dataclasses

8
推荐指数
5
解决办法
2094
查看次数

conda是否使用pip install从pypi更新软件包?

我使用Anaconda(因为它是真棒),以及可用的包通过conda install是相当广泛的.但是,我现在需要安装一个在conda存储库中不可用的软件包,所以从pypi获取它.

我的问题:当我运行命令时conda update --all,conda还会更新这些pypi包吗?或者我是否必须单独更新它们?该畅达文档似乎并没有包含一个答案.这个问题和答案似乎表明不,conda不管理pypi包,但我仍然不确定.

python pip pypi anaconda

6
推荐指数
2
解决办法
1166
查看次数

在创建实例之前修改参数以键入.NamedTuple

我期待使用有点新的typing.NamedTuple类,它允许使用通常的Python类语法创建命名元组类(包括添加文档字符串和方法,提供默认值,类型提示等等).

但是:底部的类产生以下错误消息:

AttributeError: Cannot overwrite NamedTuple attribute __new__
Run Code Online (Sandbox Code Playgroud)

从中我收集它所说的内容:压倒一切__new__仍然是禁忌.这非常令人失望.

解决这个问题的"旧方法"是从一个命名的元组类继承,但这需要我认为是一些丑陋的样板代码:

from collections import namedtuple

class FormatSpec(namedtuple('FormatSpecBase', 'fill align sign alt zero '
                                              'width comma decimal precision type')):
    __slots__ = ()
    def __new__(cls, fill, align, sign, alt, zero,
                width, comma, decimal, precision, type):
        to_int=lambda x: int(x) if x is not None else x
        zero=to_int(zero)
        width=to_int(width)
        precision=to_int(precision)
        return super().__new__(cls, fill, align, sign, alt, zero,
                               width, comma, decimal, precision, type)

FormatSpec.__doc__=_FormatSpec.__doc__.replace('FormatSpecBase','FormatSpec')
Run Code Online (Sandbox Code Playgroud)

是否有一些其他的替代方法可以让我投的zero,width和precision论据下面int …

python typing namedtuple

6
推荐指数
1
解决办法
702
查看次数

list comprehension从元组列表构建嵌套字典

我有从数据库索引user_id并analysis_type_id从数据库获取的数据(计数).这是一个3元组的列表.样本数据:

counts  = [(4, 1, 4), (3, 5, 4), (2, 10, 4), (2, 10, 5)]
Run Code Online (Sandbox Code Playgroud)

其中每个元组的第一项是count,第二个analysis_type_id,最后的user_id.

我想将它放入字典中,所以我可以快速检索计数:给出a user_id和analysis_type_id.它必须是一个两级字典.有没有更好的结构?

要"手动"构建两级字典,我会编码:

dict = {4:{1:4,5:3,10:2},5:{10:2}}
Run Code Online (Sandbox Code Playgroud)

user_id第一个dict键级别在哪里,analysis_type_id是第二个(子)键,count是dict中的值.

如何通过列表理解在dict键中创建"双深度"?或者我是否需要求助于嵌套的for循环,我首先遍历唯一user_id值,然后找到匹配analysis_type_id并在dict中一次一个地填写计数?

python dictionary list-comprehension

6
推荐指数
1
解决办法
764
查看次数

钩入内置的python f字符串格式机制

摘要

我真的很喜欢f弦。它们是令人毛骨悚然的语法。

我已经编写了一个小库(如下所述)供我自己使用,以进一步利用它们(并放在这里供其他人使用,以防对他们有帮助)。一个简单的例子:

>>> import simpleformatter as sf
>>> def format_camel_case(string):
...     """camel cases a sentence"""
...     return ''.join(s.capitalize() for s in string.split())
...
>>> @sf.formattable(camcase=format_camel_case)
... class MyStr(str): ...
...
>>> f'{MyStr("lime cordial delicious"):camcase}'
'LimeCordialDelicious'
Run Code Online (Sandbox Code Playgroud)

为了简化API的用途,并将用法扩展到内置类实例,这将非常有用,它可以找到一种方法来连接到内置的python格式设置机制,从而允许自定义内置格式的规范:

>>> f'{"lime cordial delicious":camcase}'
'LimeCordialDelicious'
Run Code Online (Sandbox Code Playgroud)

换句话说,我想重写内置format函数(由f字符串语法使用),或者扩展__format__现有标准库类的内置方法,以便我可以编写类似这个:

for x, y, z in complicated_generator:
    eat_string(f"x: {x:custom_spec1}, y: {x:custom_spec2}, z: {x:custom_spec3}")
Run Code Online (Sandbox Code Playgroud)

我通过使用自己的__format__方法创建子类来完成此操作,但是对于内置类而言,这当然不起作用。

我可以使用string.Formatterapi 接近它:

my_formatter=MyFormatter()  # custom string.Formatter instance

format_str = "x: {x:custom_spec1}, y: …
Run Code Online (Sandbox Code Playgroud)

python format

6
推荐指数
1
解决办法
120
查看次数

直接使用私有属性与使用 Get 和 Let/Set

初级 VBA 程序员(以及一般编程的初学者)希望了解有关如何有效进行 OOP 的更多信息。

有人可以解释或提供参考讨论使用 - 类模块内部 -Private Property Get和/或VBA 中的Let/Set语句与直接访问属性的好处/目的,尽管不需要对数据进行操作?

例子:

我创建了一个cDimension类(在 Excel 中)。这个类绘制线条作为Shape对象,以及一些其他不相关的东西。该DrawingScale变量允许根据需要缩放整个绘图。某些属性在获取/设置时需要进行操作,而其他属性则不需要。

因此,例如,pWidth需要进行缩放:

'clsDimension
Private pWidth As Single    
Private Property Get Width() As Single
    Width = pWidth
End Property
Private Property Let Width(w As Single)
    pWidth = w / DrawingScale
End Property
Run Code Online (Sandbox Code Playgroud)

但pColor不需要任何输入或输出操作:

Private pColor As Integer
Private Property Get Color() As Integer
    Color = pColor
End Property
Private Property …
Run Code Online (Sandbox Code Playgroud)

oop vba properties private class

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

如何使用 Anaconda 从 Windows 中的任何目录运行项目文件

这里是Python新手。我在朋友的推荐下使用 Anaconda(在 Windows 7 上)。

我想要做的是在 Notepad++ 中对我的类进行更改,然后立即在我的 Python 命令提示符窗口中测试它。

这是一个简单的问题,我似乎找不到答案:Anaconda 的默认安装期望我在哪个目录中存储 .py 文件(以便我可以使用 轻松加载它们import <MODULE NAME>)?

我的 PATH 变量设置为: C:\USERS\<USERNAME>\Anaconda3;C:\USERS\<USERNAME>\Anaconda3\Scripts

(这是默认值)

我应该在Scripts目录之外工作吗...?里面已经有很多文件了。

大多数人做什么?也许将另一个文件夹添加到 PATH 变量并在那里工作?您是否为每个项目在 PATH 中添加一个新文件夹,或者是否有更有意义的方法?我已经有一个用于其他所有内容的项目目录。我希望能够离开那里工作。

我正在 Notepad++ 中编码。我真的不想费心去设置/学习 IDE(我只是在做相对简单的 I/O 文件操作,就像我以前在 Excel 中所做的那样……太恐怖了)。

很抱歉这个非常新手的问题。我进行了搜索,但找不到任何相关内容。

接受答案后编辑:

问题是我从“开始”菜单运行 python.exe。我没有意识到你应该在你正在工作的文件夹(SHIFT+右键单击)中打开一个CMD窗口(例如C:\USERS\<USERNAME>\MY PYTHON STUFF)并从那里运行python。

python anaconda

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

mypy error: Callable has no attribute "__get__"

I have something like the following:

from typing import TypeVar, Callable, Generic, Type, Union, Optional

T = TypeVar("T")
V = TypeVar("V")

class DescClass(Generic[T, V]):
    """A descriptor."""
    def __init__(self, func: Callable[[T], V]) -> None:
        self.func = func

    def __get__(self, instance: Optional[T], owner: Type[T]) -> Callable[[], V]:
        return self.func.__get__(instance, owner)

class C:
    @DescClass
    def f(self): ...
Run Code Online (Sandbox Code Playgroud)

...for which Mypy will return this error:

test.py:12: error: "Callable[[T], Any]" has no attribute "__get__"
Run Code Online (Sandbox Code Playgroud)

What is the canonical way to specify the type for func …

python callable mypy

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

ipywidgets 中的子小部件创建使用 ViewList 和 create_child_view 产生错误

概括

请参阅此链接中托管的玩具示例 Azure 笔记本。可以从那里克隆和运行笔记本,或者从那里下载并在本地运行,但为了方便起见,所有代码也在下面。

当所有单元格运行时,javascript 控制台会在最终单元格中报告这些错误(缩写),并且最终预期的输出行不会呈现:

Error: Could not create a view for model id 91700d0eb745433eaee98bca2d9f3fc8
    at promiseRejection (utils.js:119)
Error: Could not create view
    at promiseRejection (utils.js:119)
Uncaught (in promise) TypeError: Cannot read property 'then' of undefined
Uncaught (in promise) TypeError: Cannot read property 'then' of undefined
Run Code Online (Sandbox Code Playgroud)

不知道我哪里出错了。

更新:

由于它当前存在,代码将一个字符串实例(而不是一个DOMWidgetModel实例)发送到该create_child_view方法。该字符串包含"IPY_MODEL_"由模型 id 附加。这似乎可能是问题的根源。客户端正在从服务器端 Backbonechildren模型数组项 ( this.model.get('children'))接收该字符串实例。

我想知道问题是否与低级小部件教程中讨论的小部件的 [反] 序列化有关。但我不确定如何使用它来解决这个问题,因为我需要访问子小部件模型本身而不仅仅是一个属性。而且我相信我正确地传递**widgets.widget_serialization了教程指定的内容。


细节

Notebook 包含 python 和 javascript 代码,并使用 …

javascript python backbone.js jupyter-notebook ipywidgets

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

将内置字典类型转换为 TypedDict

我有这样的东西(非常简单):

# mymodule.py

from typing import TypedDict, cast

D=TypedDict('D', {'x':int, 'y':int})
d = {}
d['x']=1
d['y']=2
d = cast(D, d)
Run Code Online (Sandbox Code Playgroud)

但 mypy 抱怨道:

mymodule.py:9: error: Incompatible types in assignment (expression has type "D", variable has type "Dict[str, int]") Found 1 error in 1 file (checked 1 source file)

将普通字典转换为子类型不应该是有效的吗TypedDict?如果不是,“构建”字典然后声明其类型的正确方法是什么?

请注意,这是非常简单的;实际上,字典是根据比上面给出的更复杂的算法构建的。

更新:即使我更改变量名称而不是尝试转换类型,问题似乎仍然存在。

# mymodule.py

from typing import TypedDict, cast

D=TypedDict('D', {'x':int, 'y':int})
d = {}
d['x']=1
d['y']=2
dd: D = d
Run Code Online (Sandbox Code Playgroud)

error: Incompatible types in assignment (expression has type …

python type-hinting mypy python-typing

4
推荐指数
1
解决办法
4533
查看次数