它决定除去直接支持__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字段一起使用?
我期待使用有点新的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 …
我有从数据库索引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中一次一个地填写计数?
我真的很喜欢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) 初级 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) 这里是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。
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 …
请参阅此链接中托管的玩具示例 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 代码,并使用 …
我有这样的东西(非常简单):
# 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 ×9
anaconda ×2
mypy ×2
backbone.js ×1
callable ×1
class ×1
dictionary ×1
format ×1
ipywidgets ×1
javascript ×1
namedtuple ×1
oop ×1
pip ×1
private ×1
properties ×1
pypi ×1
python-3.x ×1
slots ×1
type-hinting ×1
typing ×1
vba ×1