在docstring中表达关键字参数的预期类型的传统方法是什么?
或者这是否是我不应该做的事情的原则?谷歌在这个问题上毫不怀疑.
(我感兴趣的是因为我发现跟踪所有变量的预期类型非常有用,因为我编码.我使用PyCharm,当参数有意外类型时,或者当自定义类属性可能未解决时,它会发出警告)
但是,我发现有时可能的keywrord参数列表列为
def foo(bar, parameter_1: int=1, paramter_2: str='', ...etc )
Run Code Online (Sandbox Code Playgroud)
会变得漫长而难以理解..
请考虑以下代码
class Person:
def __init__(self, id: int, **kwargs):
"""
:param id: social security number
:type id: int
:param **name: person's first name
:type **name: str
:param **age: person's age in years, rounded down
:type **age: int
"""
self.data = kwargs
bob = Person(123456568, name='Bob', age=48)
sally = Person(1245654568, name='Sally', age='22')
Run Code Online (Sandbox Code Playgroud)
我想使用docstring来声明预期的类型.而且我希望PyCharm警告我,莎莉的年龄是错误的.当然,我不知道PyCharm是否有能力"理解"文档字符串中的详细程度.不过我想知道传统方法是做什么的.
关于kwargs和docstrings的其他意见和建议也欢迎.
考虑两个模块(在同一文件夹中):
首先,person.py
from typing import List
from .pet import Pet
class Person:
def __init__(self, name: str):
self.name = name
self.pets = [] # type: List[Pet]
def adopt_a_pet(self, pet_name: str):
self.pets.append(Pet(pet_name))
Run Code Online (Sandbox Code Playgroud)
然后是pet.py
from .person import Person
class Pet:
def __init__(self, name: str, owner: Person):
self.name = name
self.owner = owner
Run Code Online (Sandbox Code Playgroud)
由于循环依赖,上述代码无法正常工作。您会得到一个错误:
ImportError: cannot import name 'Person'
Run Code Online (Sandbox Code Playgroud)
使其工作的一些方法:
例如:
class Pet:
def __init__(self, name: str, owner):
Run Code Online (Sandbox Code Playgroud)
到目前为止,我列出的所有选项中都有一些缺点。
还有另一种方法吗?一个让我能够
或者:是否有充分的理由改而采用我已经列出的解决方案之一?
python annotations circular-dependency type-hinting cross-reference
在将字典声明为文字时,有没有办法输入提示我期望特定键的值?
然后,讨论:在python中有关于字典输入的指导原则吗?我想知道在词典中混合类型是否被认为是不好的做法.
这是一个例子:
考虑在类中声明字典__init__:
(免责声明:我在实例中意识到,某些.elements条目可能更适合作为类属性,但这是为了示例).
class Rectangle:
def __init__(self, corners: Tuple[Tuple[float, float]], **kwargs):
self.x, self.z = corners[0][0], corners[0][1]
self.elements = {
'front': Line(corners[0], corners[1]),
'left': Line(corners[0], corners[2]),
'right': Line(corners[1], corners[3]),
'rear': Line(corners[3], corners[2]),
'cog': calc_cog(corners),
'area': calc_area(corners),
'pins': None
}
class Line:
def __init__(self, p1: Tuple[float, float], p2: Tuple[float, float]):
self.p1, self.p2 = p1, p2
self.vertical = p1[0] == p2[0]
self.horizontal = p1[1] == p2[1]
Run Code Online (Sandbox Code Playgroud)
当我键入以下类型
rec1 = Rectangle(rec1_corners, show=True, name='Nr1')
rec1.sides['f...
Run Code Online (Sandbox Code Playgroud)
Pycharm会建议'front' 我.更好的是,当我这样做时
rec1.sides['front'].ver... …Run Code Online (Sandbox Code Playgroud) 我理解为什么“标准”类型的 numpy 数组几乎总是比包含相同类型数据的列表更有效。因此,最好养成使用 numpy 数组来做简单事情的习惯,是吗?
但是,我想知道与使用列表相比,使用 numpy 数组“存储”自定义类实例的优点和缺点是什么。
考虑
import numpy as np
class Foo:
def __init__(self, name):
self.name = name
class Bar:
def __init__(self, name):
self.name = name
self.myFoos = np.zeros(0, dtype = Foo)
def add_foo(self, some_foo):
self.myFoos = np.append(self.myFoos, some_foo)
Run Code Online (Sandbox Code Playgroud)
我可以用做的很好
self.myFoos = []
Run Code Online (Sandbox Code Playgroud)
做出这个决定时我应该记住什么?
Foo 类的复杂性有很大区别吗?(在我的用例中,它可能包含 20 或 30 个标准类型、一两个固定大小的整数数组,然后是大约 10 个简单方法。)
myFoos 中的 Foos 数量通常会产生影响吗?(在我的用例中,它将是 0 到 10)
myFoos 被处理的次数有影响吗?(在我的实际用例中,在用户操作之间可能会调用 10 到 20 次。)
Ps 虽然代码工作正常,但 pyCharm 不喜欢最后一个附加语句,它警告我
Expected type 'Union[ndarray, iterable]' got 'Foo' instead.
Run Code Online (Sandbox Code Playgroud)
提前致谢!
我需要使用 json 格式通过 api 调用将 python 后端中的数据传递到前端。在python后端,数据是字典结构,我可以轻松直接将其转换为json。但我应该吗?
我的前端开发人员认为答案是否定的,原因与最佳实践相关。
但我对此提出质疑:
最好像在 python 中一样构建 json,还是应该将其转换为其他形式,例如几个数组(如下面我的示例案例中所必需的)?
或者,换句话说:
通过 json 连接信息的集合/字典/映射/数组相关的管理原则应该是什么?
我已经用谷歌搜索了一些答案,但我没有找到太多直接解决这个问题的答案。链接将不胜感激。
(请注意下面的示例:当然,如果数据写入数据库,前端直接访问数据库可能是最有意义的,但我们假设情况并非如此)
例子:
在后端有一个名为 的对象集合pets:集合中的每个项目都有一个唯一的pet_id、一些非可选属性,例如name和date_of_birth、一些可选属性 registration_certificate_nr、adopted_from_kennel、一些列表(如 )siblings和children一些对象(如 )medication。
假设前端在某个时候需要所有这些信息,它可能是
{
"pets": {
"17-01-24-01": {
"name": "Buster",
"date_of_birth": "04/01/2017",
"registration_certificate_nr": "AAD-1123-1432"
},
"17-03-04-01": {
"name": "Hooch",
"date_of_birth": "05/02/2015",
"adopted_from_kennel": "Pretoria Shire",
"children": [
"17-05-01-01",
"17-05-01-02",
"17-05-01-03"
]
},
"17-05-01-01": {
"name": "Snappy",
"date_of_birth": "17-05-01",
"siblings": [
"17-05-01-02", …Run Code Online (Sandbox Code Playgroud) 我正在使用React js和Material UI创建一些表单。我想使某些列表上的字体大小变小,以便获得更紧凑的显示效果,但是无论我在哪个级别添加代码,fontSize={10}它似乎都无效。
如何更改fontSize?
这是一些示例代码,这些代码是我从Material UI文档上的Sandbox获得的。
const styles = theme => ({
root: {
width: '100%',
maxWidth: 360,
backgroundColor: theme.palette.background.paper,
},
});
function FolderList(props) {
const { classes } = props;
return (
<div className={classes.root}>
<List>
<ListItem>
<ListItemText primary="Photos" secondary="Jan 9, 2014" />
</ListItem>
<ListItem>
<ListItemText primary="Work" secondary="Jan 7, 2014" />
</ListItem>
</List>
</div>
);
}
Run Code Online (Sandbox Code Playgroud) python ×5
type-hinting ×3
list ×2
annotations ×1
arrays ×1
class ×1
dictionary ×1
docstring ×1
javascript ×1
json ×1
kwargs ×1
material-ui ×1
numpy ×1
pycharm ×1
reactjs ×1
types ×1
typing ×1