- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在common-lisp可以写
(defclass thing ()
((x :initarg :x :accessor thing-x)
(y :initarg :y :accessor thing-y)))
;; create foo of class thing with values (x=0,y=1)
(setq foo (make-instance 'thing :x 0 :y 1))
;; access attributes x and y in the scope defined by with-slots as
;; local variables and increment them
(with-slots (x y) foo
(incf x) (incf y))
;; now foo has values (x=1,y=2)
现在,在 Python3 中,我已经实现了一个数学模型,在该模型中我创建了一个变量和其他组件的字典。如果那时我需要用这些变量写一些数学表达式,在创建模型之后,我必须写类似的东西
model.expr1 = model.var1 + data.coef2 * model.var2 ....
当然,var1...varn
有更长的更具描述性的名称。
为了提高可读性我想要一些东西
with ModelSlots(model) as (var1, var2, ... varn):
model.expr1 = var1 + data.coef2 * var2 ...
...
据我了解,每个上下文管理器只返回一个对象,因此上面的解决方案应该是不可能的。
你知道如何在 python 中实现它吗?
当然,最明显的解决办法是
var1 = model.var1
var2 = model.var2
...
但这很冗长,难以阅读,使上下文更加困惑,并且还可能导致模糊的错误,因为我可能会无意中将一些局部 var
变量初始化为错误的值。
每个变量都有多个上下文管理器
with Var1(model) as var1:
with Var2(model) as var2:
...
也不是解决方案,因为我可以在同一范围内使用多个变量,我可能想快速更改或添加新变量。必须为它们中的每一个定义一个上下文管理器会太麻烦。
TIA
编辑1
评论 Felix 解决方案。插槽的排序/匹配可以通过以下方式解决:
from bunch import Bunch
class ModelSlots:
def __init__(self, model, *slots):
self._model = model
self._slots = list(map(lambda x: getattr(model,x), slots))
def __enter__(self):
return self._slots
def __exit__(self, *args):
pass
if __name__ == '__main__':
model = Bunch()
model.foo = 1
model.bar = 2
with ModelSlots(model, "bar", "foo") as (bar,foo):
print((foo, bar))
# prints (1,2)
但是你需要重复插槽的名称两次,带引号和不带引号......
最佳答案
Python 支持元组解包,即使在 with 语句中也是如此。请参阅下面的实际操作:
class ModelSlots:
def __init__(self, model):
self._model = model
def __enter__(self):
return self._model.values()
def __exit__(self, *args):
pass
if __name__ == '__main__':
model = {"foo": 1, "bar": 2}
with ModelSlots(model) as (foo, bar):
print(foo + bar)
# prints 3
这是你要的吗?
我不确定这在总体上是否是个好主意。 with 语句中的名称 foo
和 bar
与模型中的变量名称无关,因此很容易意外混淆它们(例如通过更改它们的顺序) .这可能会导致非常微妙的错误。
总而言之,我认为它“有点”可能,但根据您的应用程序可能会很危险。
关于Python 访问对象属性 a la with-slots lisp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53776132/
如果我执行 ls -la,我会得到如下结果 total 16 drwxr-xr-x 4 rockse staff 136 Apr 28 16:55 . drwx------+ 23 rocks
有人可以向我解释为什么 MARS 将伪指令翻译成两条指令:lui 和 ori?是否存在仅翻译一条指令的情况? 最佳答案 这个简单的程序 .data msg: .asciiz
在 MIPS 中,la指令转换为 lui和 ori .然而,MARS Simulator 似乎根本没有这样做。当我转储以下机器代码时: .text la $a0, array la $
这是一个由两部分组成的问题,与在 Angular 中操作数据数组中的元素有关。从 ViewModel 中的数组中删除元素的方法似乎非常普遍: $scope.array.splice(index, 1)
我将不胜感激任何“一步一步”指南,说明如何更改 PHP/HTML 页面上的动态数据库连接/连接字符串/等上的代码,使其“即插即用”工作通过 ftp 将页面和 MySQL 数据库托管在“Azure 网站
我遇到了与此类似的问题 unanswered question 。我正在将代码提交到构建系统以使用其 g++ 二进制文件。但是,构建会移动到具有随机生成名称的临时路径(例如 /temp-build/1
我的问题类似于this question ,它询问如何将属性替换为字符串,例如 Transfer {0} from {1} to {2} on {3} 该问题的答案是 MessageFormat 类,
我正试图在 android 上复制我公司在外部开发的 iphone 应用程序。 我的需求很简单,但是在android下好像很难实现。我有三个数字编辑文本输入。每个都应该只采用十进制数值。所以数字 0-
关闭。 这个问题不符合 Stack Overflow guidelines 。它目前不接受答案。 这个问题似乎与 a specific programming problem, a software
在 PHP 中我可以这样做: print <<
我必须使用 C 重新实现 printf(3),而不使用任何可以为我进行转换的函数。 在我理解了 感谢各位 %a 的工作原理后,我以为我已经完成了:How %a conversion work in p
我想通过索引将元素添加到一个空列表中。例如,我想将 4 添加到列表 a 的第 5 位。 x = 4 a = [] 在 C++ 等其他语言中,我可以创建一个包含 10 个索引的数组,一开始都是空的,然后
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: When running ls -l, why does the filesize on a directo
在模块 warnings ( https://docs.python.org/3.5/library/warnings.html ) 中,可以发出警告,该警告似乎来自堆栈中较早的地方: warning
我是一名强类型语言支持者,但我正在从事一个大型 PHP 项目。 我一直在使用 PhpStorm,我喜欢您可以提供的额外类型提示,以及如下注释: /** @var \Payments $payment
我想知道它们是如何生成的,以及它们是否在我每次打开应用程序时生成或存储(缓存)。 这只是一个 Canvas (以编程方式)还是他们使用 XML?像这样,然后他们以编程方式添加字母:
我知道 .so 文件是一种动态库(许多线程可以共享这样的库,因此内存中不需要有多个副本)。但是 .a 和 .la 有什么区别呢?这些都是静态库吗? 如果动态库比静态库有很大的优势,为什么还有很多静态库
我必须将类似Wufoo的WYSIWYG表单生成器功能添加到Rails Webapp。 有谁知道会有所帮助的良好资源( gem /引擎/插件/示例代码)? 最佳答案 这并不是您所提问题的真正答案,但是很
向您学习 Haskell 提到的 difference lists (在该页面上搜索该术语),其中列表 l不直接表示,而是作为函数 (l++) .这允许更有效的左右连接。串联变成函数组合,最终可以通过
引用文献说la(加载地址)的伪代码被翻译为: Pseudo : la $1, Label lui $1, Label[31:16] ori $1,$1, label[15:0] 但是当我尝试在 M
我是一名优秀的程序员,十分优秀!