我是 github/gitlab 上托管的一个项目的维护者,该项目有许多贡献者。我想从 usingmaster作为默认分支迁移到main. 我该如何做到这一点而不搞砸?
我读过一些关于该主题的博客文章,但更喜欢在 StackOverflow 上进行讨论,其中评论可能会指出一个人可能忽略的问题。
如果我想知道哪些字母是ascii字符集的一部分,我可以简单地询问python,这很好:
>>> import string
>>> string.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
Run Code Online (Sandbox Code Playgroud)
我搜索了一会儿,但找不到返回任意编码字符集的泛型函数.像这样的东西:
>>> import string
>>> string.get_charset('latin1') # doesn't exist =(
'abc ... äöü ...'
Run Code Online (Sandbox Code Playgroud)
还是我错过了?检查字符串是否只包含某些编码字符的函数也可以使用,但我希望将所有有效字符作为列表的直观性.
我一直在尝试使用文件中的属性名称动态加载的数据类,但无法找到创建“冻结”和“非冻结”属性的方法。我相信数据类只允许您将所有属性设置为冻结或非冻结。
截至目前,我创建了一个冻结数据类,并添加了一个可变类作为我可以随时更改的属性之一,但我对这种方法的可读性不太满意。
人们是否会推荐另一个Pythonic数据类,而不需要实现一个能够设置可变/不可变属性的类?
import dataclasses
class ModifiableConfig:
"""There is stuff in here but you get the picture."""
...
config_dataclass = dataclasses.make_dataclass(
'c',
[(x, type(x), v) for x, v in config.items()] + [('var', object, ModifiableConfig())],
frozen=True
)
Run Code Online (Sandbox Code Playgroud)
不过,我更喜欢能够选择哪些属性被冻结,哪些属性不被冻结。不再需要向数据类添加额外的类。它可能看起来像这样:
config_dataclass_modifiable = dataclasses.make_dataclass(
'c', [(x, type(x), v, True if 'modifiable' in x else False) for x, v in config.items()])
Run Code Online (Sandbox Code Playgroud)
请注意“如果 x else False 中‘可修改’则为 True”,我并不是说这就是我最终会做的事情,但希望这有助于更好地理解我的问题。
这是我的目录结构,
??? test
? ??? test.f90
? ??? __init__.py
? ??? test.py
Run Code Online (Sandbox Code Playgroud)
现在我想用命令行工具制作一个包test。现在我有两个选择,1. numpy distutils 和 2. setuptools。
问题distutils在于它不支持入口点,现在也不推荐使用。但它确实完美地编译了 fortran 代码。现在对于 setuptools 我正在尝试使用此代码,
mod = Extension(name = 'foo.adt', sources = ['test/test.f90'])
setup(
name = 'foo',
packages = ['foo'],
package_dir = {'foo':'test'},
ext_modules = [mod],
entry_points={
'console_scripts': [
'hello = foo.test:main',
],
}
)
Run Code Online (Sandbox Code Playgroud)
如果我尝试使用它,则会抛出此错误
error: unknown file type '.f90' (from 'test/test.f90')
Run Code Online (Sandbox Code Playgroud)
所以,我猜 setuptools 不支持 fortran 文件?那么,如何编译 fortran 代码、创建包并为其创建入口点?
我想限制数据类实例的最大数量,并知道实例的索引。这是我想要的行为:
Veget('tomato', 2.4, 5)
Veget('salad', 3.5, 2)
Veget('carot', 1.2, 7)
for Veget in Veget.instances:
print(Veget)
Run Code Online (Sandbox Code Playgroud)
Veget(index=0, name='tomato', price=2.4, quantity=5)
Veget(index=1, name='salad', price=3.5, quantity=2)
Veget(index=2, name='carot', price=1.2, quantity=7)
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法,该方法确实可以处理创建限制:
Veget('tomato', 2.4, 5)
Veget('salad', 3.5, 2)
Veget('carot', 1.2, 7)
for Veget in Veget.instances:
print(Veget)
Run Code Online (Sandbox Code Playgroud)
但打印时不会显示索引:
Veget(name='tomato', price=2.4, quantity=5)
Veget(name='salad', price=3.5, quantity=2)
Veget(name='carot', price=1.2, quantity=7)
Run Code Online (Sandbox Code Playgroud) 所以,我在一个文件中有这两个数据类:
@dataclass
class A:
children: List[B]
@dataclass
class B:
parent: A
Run Code Online (Sandbox Code Playgroud)
,这可以通过使用该__future__.annotations功能来实现。
然后我有另外两个文件,每个文件都有一堆对于我的项目来说是静态的每种类型的对象。
文件objects_A:
import objects_B
obj_a1 = A(
children=[
objects_B.obj_b1,
objects_B.obj_b2
]
)
Run Code Online (Sandbox Code Playgroud)
文件objects_B:
import objects_A
obj_b1 = B(
parent=objects_A.obj_a1
)
obj_b2 = B(
parent=objects_A.obj_a1
)
Run Code Online (Sandbox Code Playgroud)
显然,文件之间存在循环依赖问题,但即使它们位于同一个文件中,它也不起作用,因为一种类型的变量依赖于另一种类型的变量才能成功。
初始化B内部对象obj_a1也不起作用,因为self这里没有概念。
目前,我设置parent为None(针对类型提示),然后循环进行设置obj_a1:
for obj_b in obj_a1.children:
obj_b.parent = obj_a1
Run Code Online (Sandbox Code Playgroud)
大家有什么好主意吗?
不知道它是否有帮助,但是这些对象是静态的(它们在这些声明之后不会改变)并且它们具有某种父子关系(正如您肯定已经注意到的那样)。
如果可能的话,我希望将每种类型的变量放在不同的文件中。
python forward-declaration circular-reference python-3.x python-dataclasses
当激活诗歌 python shell 时,我在 bash 提示符中收到一个非常长的字符串:
(my-current-folder-pNzYm0GW-py3.8) (base) myusername@mycomputername>
Run Code Online (Sandbox Code Playgroud)
我希望它更短,也许像这样:
(py3.8) myusername@mycomputername>
Run Code Online (Sandbox Code Playgroud)
有谁知道这是怎么做到的吗?
(我猜这base来自于系统上也安装了 miniconda,我可以通过编辑我的 来修复它.bashrc)
我用来ElementTree解析/构建一些稍微复杂但定义良好的 xml 文件,并用于mypy静态类型。我的.find陈述遍布各处,这导致了这样的事情:
from xml.etree.ElementTree import Element
...
root.find('tag_a').append(Element('tag_b'))
# run mypy..
-> type None from Optional[Element] has no attribute append
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为find根本找不到我给它的标签。但我知道它就在那里,并且不想添加类似try..exceptorassert语句之类的东西,本质上只是简单地保持沉默mypy,而不添加功能,同时使代码可读性较差。我也想避免# type: ignore到处发表评论。
我尝试了猴子修补Element.find.__annotations__,在我看来这将是一个很好的解决方案。但由于它是内置的,我不能这样做,而且子类化Element又感觉太多了。
有没有好的办法解决这个问题呢?
我想知道是否提交给 Tuple[float, ...] 即使我知道元组的长度。
我有一个 Point 和一个 Rect 类,以及 Rect 类中的一个属性aspoints,该属性将作为两个元组返回左上角和右下角的元组。
迭代器有 type Iterator[float],我知道它会给我两个浮点数。我希望属性的返回值是,
Tuple[Tuple[float, float], Tuple[float, float]]
因为我知道迭代器将为每个点提供两个浮点数。
我应该提交,并只说它会返回一个Tuple[Tuple[float, ...], Tuple[float, ...]],在它们的长度的文档中留下评论,还是有更好的解决方案?
这是代码。
from dataclasses import dataclass
from typing import Iterator, Tuple
@dataclass
class Point:
x: float
y: float
def __iter__(self) -> Iterator[float]:
return iter((self.x, self.y))
@dataclass
class Rect:
x: float
y: float
width: float
height: float
@property
def tl(self) -> Point:
return Point(self.x, self.y)
@property
def br(self) -> Point:
return Point(self.x + self.width, …Run Code Online (Sandbox Code Playgroud) 我有以下数据类。
@dataclass(frozen=True)
class myDataClass:
x: float
y: float
Run Code Online (Sandbox Code Playgroud)
我想要的是,每次创建此类的对象时,它都会被标记一个从 0 开始递增的唯一 id。
所以,第一次我说first = myDataClass(0, 1)那么我应该得到first.id == 0,然后如果我说second = myDataClass(0, 1),我应该得到second.id == 1。
python ×8
python-3.x ×4
mypy ×2
elementtree ×1
git ×1
github ×1
gitlab ×1
immutability ×1
mutable ×1
numpy ×1
pyenv ×1
python-3.7 ×1
setup.py ×1
setuptools ×1
unicode ×1