我需要确保所有命名的参数都传递给一个方法(我不想要任何默认值).以下是执行它的最佳方法吗?
class X:
def func(self, **kwargs):
if set(kwargs.keys() != ('arg1', 'arg2', 'arg3'):
raise ArgException(kwargs)
Run Code Online (Sandbox Code Playgroud) 我有一个类层次结构,__init__在其中class Base执行一些预初始化然后调用方法calculate.该calculate方法已定义class Base,但预计将在派生类中重新定义.重新定义calculate将使用仅在class Derived以下情况下可用的一些属性:
class Base:
def __init__(self, args):
# perform some pre-initialization
...
# now call method "calculate"
self.calculate()
class Derived(Base):
def __init__(self, args, additional_attr):
super().__init__(args)
# do some work and create new instance attributes
...
self.additional_attr = additional_attr
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为calculate在class Derived分配self.additional_attr之前将调用方法in .
我无法将super().__init__(args)调用移到__init__方法的末尾,因为它所做的一些工作必须在处理之前完成additional_attr.
该怎么办?
由于一个错误(可能在我使用的numpy发行版中),我无法使用numpy.linalg.lstsq.我发现的每个统计库都没有安装在python 3下(在Windows上).
有人有纯python 3代码可以执行多元线性回归(我只需要测试版)?
如果不是纯python,我仍然可以尝试它,如果代码碰巧不使用numpy.linalg.lstsq在我的机器上崩溃的相同C函数.
谢谢!
例:
class A:
a = 1
class B(A):
b = 2
y = b # works fine
x = a # NameError: name 'a' is not defined
x = A.a # works fine
z = B()
z.a # works fine
B.a # works fine
Run Code Online (Sandbox Code Playgroud)
为什么x = a不允许?在每个其他上下文中(通过实例访问,通过子类名称访问)它工作正常; 但不知何故,在课堂内部,它不起作用.
并且考虑到这种行为,我似乎无法实现一个类层次结构,其中每个类定义了一些额外的属性 - 因为我不能在子类中访问它们而不知道它们在层次结构中的确切位置.
这是我正在尝试(不成功)做的事情:
class X:
accelerate = compose(f1, f2, f3) # f1, f2, f3 are functions
class Y(X):
move = compose(f4, f5)
stop = f6
class Z(Y):
action = …Run Code Online (Sandbox Code Playgroud) 我需要将所有元素附加list_到 a 中string;最后我需要添加一个后缀。一个点'.' 必须分离所有元素:
list_ = args[f(n) : f(n+1)]
if list_:
string += '.' + '.'.join(list_) + '.' + suffix # works except when list_ is empty
else:
string += '.' + suffix
# list_ isn't used after this
Run Code Online (Sandbox Code Playgroud)
我可以在一行中以更简单的方式重写它吗?如果join在每个元素后添加一个分隔符,它将是这样的:
string += '.' + '.'.join(args[f(n) : f(n+1)]) + '.' + suffix
Run Code Online (Sandbox Code Playgroud)
编辑
我刚刚了解到:
切片即使从未分配给副本也是副本:Python 是否对字符串执行逐引用切片?
但 islice 可能更糟,因为它遍历列表的开头:itertools.islice 与列表切片相比
此处讨论了一些替代方案:Avoiding enough slice copying in Python
我有一个类BigStructure从一些输入构建一个复杂的数据结构.它还包括对该数据结构执行操作的方法.
这个课程变得太大了,所以我试图把它分成两部分来帮助维护.我认为将课程转移到一个新班级是很自然的,比如上课OperationsOnBigStructure.
不幸的是,由于课程BigStructure非常独特,OperationsOnBigStructure因此无法与其他课程合理地重复使用.从某种意义上说,它永远与之相关BigStructure.例如,典型的操作可能包括以对BigStructure对象有意义的方式遍历大型结构实例.
现在,我有两个课程,但感觉我没有改进任何东西.事实上,我使事情稍微复杂一点,因为我现在需要将BigStructure对象传递给方法OperationsOnBigStructure,并且他们需要在内部存储该对象.
我应该和一个大班同学吗?
我对程序状态进行了多次检查,其失败将表明代码中存在错误。在这种情况下,我很乐意使用,assert condition因为它比if not condition: raise MyException.
使用assert代替raise有两个问题。
assert不允许指定要引发的异常,因此稍后捕获它会变得困难(捕获AssertionError可能捕获太多)。
assert当 -O 标志传递给解释器时禁用。
在我的环境中,代码中的任何错误都要求我放弃所有结果,直到识别并修复该错误。因此,捕获上述检查引发的异常是没有意义的。因此,问题#1 与我的情况无关。
问题#2 很严重。我希望我的检查保留在生产代码中,因为正确性比我的环境中的性能重要得多。如今很少有人使用 -O 标志;但有一天我或其他人可能更喜欢使用它(例如,抑制后面的代码if __debug__,或者因为 -O 可能在将来实际上优化代码)。由于我的所有assert语句都必须在生产代码中保持活动状态,因此我需要将所有assert语句替换为其他语句。assert尽管有 -O 标志,有什么方法可以强制留下来吗?
顺便说一句,我计划assert通过打印导致断言失败的行中的变量值来自定义行为。我想我可以通过替换sys.excepthook为我自己的函数来实现它,该函数捕获AssertionError,读取回溯,找到相关的源代码,打印相关行中的变量,然后重新引发异常。如果有人发现有问题,请告诉我。
在关于实体关系图的每个教程中,我都知道不允许为关系指定固定的基数.只有关于ERD的非正式评论才能澄清飞行员的数量exactly 2.
因此,例如,航班和飞行员之间的关系,每个航班正好有2名飞行员,必须表示为:
<flight> 0..N <------> 1..N <pilot>
Run Code Online (Sandbox Code Playgroud)
而不是
<flight> 0..N <------> 2 <pilot>
Run Code Online (Sandbox Code Playgroud)
我的符号是0..N=可选的,很多; 1..N=强制性,许多,1=强制性,一个.
这种限制是否普遍?它背后的原因是什么?
编辑:澄清了我的记号.
编辑:我可以看到两个关系如何强制执行相同的约束:
0..N <------> 1
<flight> <pilot>
0..N <------> 1
Run Code Online (Sandbox Code Playgroud)
但是,查询飞行员是否在某个特定航班上的查询变得非常难看,因为您必须检查两个属性中的每一个.如果属性数量增加(例如,对15名空乘人员),则查询变得完全无法管理,并且架构几乎无法管理.
之后我想做有条件的计数groupby; 例如,按列的值进行分组A,然后在每个组中计算值5在列中出现的频率B.
如果我是为整个做这个DataFrame,那就是len(df[df['B']==5]).所以我希望我能做到df.groupby('A')[df['B']==5].size().但我想布尔索引在GroupBy对象中不起作用.
例:
import pandas as pd
df = pd.DataFrame({'A': [0, 4, 0, 4, 4, 6], 'B': [5, 10, 10, 5, 5, 10]})
groups = df.groupby('A')
# some more code
# in the end, I want to get pd.Series({0: 1, 1: 2, 6: 0})
Run Code Online (Sandbox Code Playgroud) scala> val a = Int
a: Int.type = object scala.Int
scala> val a = String
<console>:11: error: object java.lang.String is not a value
val a = String
^
Run Code Online (Sandbox Code Playgroud)
为什么scala不会java.lang.String为了创造String价值而在周围创建薄包装纸?当主要类型(String)之一不能在表达式中使用或不能传递给函数或从函数返回时,它不是很严格吗?
python ×7
python-3.x ×6
class ×3
assert ×1
coding-style ×1
erd ×1
grouping ×1
interpreter ×1
math ×1
namespaces ×1
numpy ×1
pandas ×1
scala ×1
scipy ×1