早上好,
我目前正在编写一个python库.目前,模块和类以无组织的方式部署,没有合理的设计.当我接近更正式的版本时,我想重新组织类和模块,以便他们有更好的整体设计.我绘制了一个导入依赖关系图,我计划按层级聚合类.此外,我正在考虑对类进行一些修改,以减少这些依赖性.
您对可能复杂且正在制作的python库进行良好整体设计的策略是什么?你有什么有趣的建议吗?
谢谢
更新:
我确实在寻找一个经验法则.例如,假设发生这种情况(为清楚起见,删除了init .py)
foo/bar/a.py
foo/bar/b.py
foo/hello/c.py
foo/hello/d.py
Run Code Online (Sandbox Code Playgroud)
现在,如果您碰巧有d.py导入bar.b和a.py导入hello.c,我会认为这是一个糟糕的设置.另一个案例是
foo/bar/a.py
foo/bar/baz/b.py
foo/bar/baz/c.py
Run Code Online (Sandbox Code Playgroud)
假设a.py和b.py都导入c.你有三个解决方案:1)b导入c,导入baz.c 2)你在foo/bar中移动c.a.py导入c,b.py导入.c 3)你将c移动到其他地方(比如foo/cpackage/c.py)然后a和b导入cpackage.c
我倾向于更喜欢3),但如果c.py作为独立模块没有意义,例如因为你想将它保持为"私有"进入条形包,我会优先选择1).
还有许多其他类似的案例.我的经验法则是尽量减少依赖关系和交叉的数量,以防止高度分支,高度交织的设置,但我可能是错的.
我有下表:
CREATE TABLE `events` (
`evt_id` int(11) NOT NULL AUTO_INCREMENT,
`evt_name` varchar(50) NOT NULL,
`evt_description` varchar(100) DEFAULT NULL,
`evt_startdate` date NOT NULL,
`evt_enddate` date DEFAULT NULL,
`evt_starttime` time DEFAULT NULL,
`evt_endtime` time DEFAULT NULL,
`evt_amtpersons` int(11) DEFAULT NULL,
`sts_id` int(11) NOT NULL,
`adr_id` int(11) DEFAULT NULL,
`evt_amtPersonsSubs` int(11) DEFAULT NULL,
`evt_photo` varchar(50) DEFAULT NULL,
`sys-mut-dt` timestamp NULL DEFAULT NULL,
`sys-mut-user` varchar(20) DEFAULT NULL,
`sys-mut-id` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`evt_id`),
KEY `sts_id` (`sts_id`),
KEY `adr_id` (`adr_id`),
CONSTRAINT `sts_id` …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用不应修改的文件来创建模型.但该文件的评论可以.
这是我做的,但我们无法修改评论.如何测试是否已发送新文件(使用浏览按钮),仅在此情况下,创建模型的新实例?如果没有上传新文件,请更新评论.
admin.py
class CGUAdminForm(forms.ModelForm):
class Meta:
model = ConditionsUtilisation
def clean_file(self):
if self.instance and self.instance.pk is not None:
raise forms.ValidationError(_(u'You cannot modify the file. Thank you to create a new instance.'))
# do something that validates your data
return self.cleaned_data["file"]
class CGUAdmin(admin.ModelAdmin):
form = CGUAdminForm
admin.site.register(ConditionsUtilisation, CGUAdmin)
Run Code Online (Sandbox Code Playgroud)
models.py
class ConditionsUtilisation(models.Model):
date = models.DateField(_(u'Date d\'upload'), editable=False, auto_now_add=True)
comment = models.TextField(_(u'Commentaire de modification'))
file = models.FileField(_(u'CGU'), upload_to='subscription/cgu/', storage=CGUFileSystemStorage())
Run Code Online (Sandbox Code Playgroud) 我对以下程序有些困惑
module test
implicit none
type TestType
integer :: i
end type
contains
subroutine foo(test)
type (TestType), intent(out) :: test
test%i = 5
end subroutine
subroutine bar(test)
type (TestType), intent(out) :: test
test%i = 6
end subroutine
end module
program hello
use test
type(TestType) :: t
call foo(t)
print *, t%i
call bar(t)
print *, t%i
end program hello
Run Code Online (Sandbox Code Playgroud)
及其衍生物。稍后再谈。正如我们所知,Fortran语言传递程序参数作为一个传递引用,这意味着实体出现在伪参数test
两者foo
与bar
被许可的堆栈上相同的内存空间program hello
。到现在为止还挺好。
假设我在program hello
中定义type(TestType) :: t
为一个指针,并分配它。
program hello
use …
Run Code Online (Sandbox Code Playgroud) 在python中,你有__coerce__
和__ihook__
.根据PEP 203(增强的分配),它们被调用,按此顺序执行对象的就地操作,__coerce__
调用first和__ihook__
next.我不知道这些方法是否专门用于增强赋值,但我想知道两者之间的实际区别.
我注意到以下事实:功能评估的顺序,例如总和,在标准中未指定,因此可以以任何顺序执行.
这引出了一个问题:它依赖于编译器,依赖于优化,甚至可能依赖于执行(我怀疑它可能涉及代码的重新调整,但在今天的多核环境中,我猜一些编译器可能会看到这种缺乏的优化机会规范,通过并行隐式执行两个调用)?
编辑:我想澄清一下.标准中未指定顺序的事实并不意味着它没有为特定编译器指定(我可以选择在文档中指定它).未指定的行为可能使您不可移植,但编译器可能会根据给定规则一致地运行.我有兴趣知道,纯粹是出于学术上的好奇,如果这个规范实际上是由编译器(例如在手册中)做出的,如果是的话,如果这个选择是一致的,或者可能被编译器选项或其他因素改变.例如,拿gcc.它是如何表现的?它一致吗?
我在这个琐碎的节目中发现了一个非常奇怪的效果
module Moo
contains
subroutine main()
integer :: res
real :: start, finish
integer :: i
call cpu_time(start)
do i = 1, 1000000000
call Squared(5, res)
enddo
call cpu_time(finish)
print '("Time = ",f6.3," seconds.")',finish-start
end subroutine
subroutine Squared(v, res)
integer, intent(in) :: v
integer, intent(out) :: res
res = v*v
end subroutine
! subroutine main2()
! integer :: res
! real :: start, finish
! integer :: i
!
! call cpu_time(start)
!
! do i = 1, 1000000000
! …
Run Code Online (Sandbox Code Playgroud) > packageVersion("stats")
[1] ‘3.5.3’
Run Code Online (Sandbox Code Playgroud)
返回的实体不是字符串。它是一个类型为 package_version 的 S3 类
> class(packageVersion("stats"))
[1] "package_version" "numeric_version"
Run Code Online (Sandbox Code Playgroud)
这个实体没有属性,没有名字,什么都没有。
> attributes(packageVersion("stats"))
$class
[1] "package_version" "numeric_version"
> names(packageVersion("stats"))
NULL
Run Code Online (Sandbox Code Playgroud)
但不知何故这有效
> packageVersion("stats")$major
[1] 3
Run Code Online (Sandbox Code Playgroud)
还有次要和补丁。问题是,如何以字符串形式获取完整版本?推论问题,为什么当我询问名称时,major、minor 和 patch 不显示,以及如何查看该实体支持的完整名称列表?
在 R 中,我可以使用.subset2
充当调度[[
或$
不充当调度。
> a <- new.env()
> a$foo <- 3
> .subset2(a, "foo")
[1] 3
Run Code Online (Sandbox Code Playgroud)
但是,我似乎找不到不分派的设置操作的等效项:
> .subset2(a, "foo") <- 5
Run Code Online (Sandbox Code Playgroud)
.subset2(a, "foo") <- 5 中的错误:找不到函数“.subset2<-”
如何在不使用[[<-
or$<-
运算符隐式分派的情况下设置某些内容?