我正在写一个依赖承诺的angularjs应用程序,虽然它正在工作,但我想知道我是否可以更优化地做到这一点.
在代码的开头,我正在创建一个获取一些数据的承诺.完成后,我想运行几个都使用这些数据的函数.这些函数附加在应用程序的不相关部分,因此我不知道它们附加到承诺的顺序.它们也不需要按顺序完成.
app.service("Fetch", function ($q){
return function() {
var def = $q.defer();
somelibrary.asynccall(function(error, data){ //callback
if (error) def.reject(error);
else def.resolve(data);
});
return def.promise;
};
});
app.controller("ctrl", function ($scope, Fetch) {
var prom = Fetch();
//somewhere:
prom.then(function(data){$scope.var1 = data["VAR1"];});
//somewhere else:
prom.then(function(data){$scope.var2 = data["VAR2"]});
});
Run Code Online (Sandbox Code Playgroud)
这里的主要缺点是后者then只在前面的那些完成时执行,这在此不是必需的.
另外,我需要return data在每个内部添加function(data){...},否则以下then()没有data可用.
有没有其他方法可以做到这一点,更适合这种情况?
编辑:正如@jfriend00所提到的,我错了; 事实上,只要成功解决了承诺,这两个函数就会并行运行,并且它们不会被链接,因此不会相互依赖.谢谢你的帮助
TL;DR:我想就地更改熊猫数据框列的数据类型。
我有一个熊猫数据框:
df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6.1]})
Run Code Online (Sandbox Code Playgroud)
默认情况下,它的列在我的系统上分配了“int64”和“float64”:
df.dtypes
Out[172]:
a int64
b float64
dtype: object
Run Code Online (Sandbox Code Playgroud)
因为我的数据框会非常大,所以我想在创建数据框后将列数据类型设置为 int32 和 float32。我知道我怎么能做到这一点:
df['a'] = df['a'].astype(np.int32)
df['b'] = df['b'].astype(np.float32)
Run Code Online (Sandbox Code Playgroud)
或者,在一个步骤中:
df = df.astype({'a':np.int32, 'b':np.float32})
Run Code Online (Sandbox Code Playgroud)
我的数据框的 dtypes 确实是:
df.dtypes
Out[180]:
a int32
b float32
dtype: object
Run Code Online (Sandbox Code Playgroud)
但是:这看起来很笨拙,必须重新分配系列,尤其是。因为许多inplacePandas方法都有一个kwarg。但是,使用它似乎不起作用(从顶部的相同数据框开始):
df['a'].astype(np.int32, inplace=True)
df.dtypes
Out[187]:
a int64
b float64
dtype: object
Run Code Online (Sandbox Code Playgroud)
有什么我在这里俯瞰的吗?这是故意的吗?使用Series代替DataFrame对象时显示相同的行为。
非常感谢,
我正在使用d3进行图形化,我正在尝试创建一个svg对象,以便稍后添加到DOM中.
我曾经有过
var svg = d3.select(el).append("svg");
var graph = svg.append("g")
...etc...
Run Code Online (Sandbox Code Playgroud)
由于我不打算进入的原因,我想在将svg元素附加到DOM之前创建元素.
所以我做了
var svg = d3.select(document.createElementNS(d3.ns.prefix.svg, 'svg'))
var graph = svg.append("g")
...etc...
Run Code Online (Sandbox Code Playgroud)
,这是有效的,并且在调试时,我可以看到这svg是一个1元素的数组,孩子很好地附加.
问题来自于这append一步:
d3.select(el).append(svg);
Run Code Online (Sandbox Code Playgroud)
在那里,我得到一个错误Error: Failed to execute 'createElementNS' on 'Document': The qualified name provided ('[object SVGSVGElement]') contains the invalid name-start character '['.我已经看过这里:如何创建"svg"对象而不附加它?但似乎这正是他们的建议.
知道为什么会这样吗?我试过追加svg[0],但也没有运气.它似乎append()只需要字符串作为参数.
编辑:https : //github.com/mbostock/d3/wiki/Selections#append状态下的d3参考
selection.append(name)...... ......"可以将名称指定为常量字符串,也可以指定为返回要追加的DOM元素的函数."
因此我试过了
d3.select(el).append(function(){return svg;});
Run Code Online (Sandbox Code Playgroud)
但是失败了 Error: Failed to execute 'appendChild' on 'Node': The new …
TLDR:当基类在可导入模块中返回子类实例时,如何避免循环导入错误?
我从其他位置/问题收集了一些解决方案(参见下面的 AD),但恕我直言,没有一个是令人满意的。
# onefile.py
from abc import ABC, abstractmethod
class Animal(ABC):
def __new__(cls, weight: float):
if cls is Animal:
# Try to return subclass instance instead.
for subcls in [Dog, Cat]:
try:
return subcls(weight)
except ValueError:
pass
raise NotImplementedError("No appropriate subclass found.")
return super().__new__(cls)
@property
@abstractmethod
def weight(self) -> float:
"""weight of the animal in kg."""
...
class Dog(Animal):
def __init__(self, weight: float = 5):
if not (1 < weight < …Run Code Online (Sandbox Code Playgroud) 我需要在 excel 中格式化日期,并且我正在尝试使用该TEXT公式。问题在于 Excel 对参数的解释会随着语言环境的变化而变化。
例如:如果我在单元格 A1 中有一个日期,我想以年月日格式转换为文本,=TEXT(A1, "yyyy-mm-dd")如果我的电脑有英语语言环境,我必须使用,但是=TEXT(A1, "jjjj-MM-tt")(我孩子你不是,M必须是大写)如果它有德语语言环境。这使得文档不可移植。(第二个参数是纯文本,因此在更改区域设置时不会转换。)
评论:
这只是一个例子,我知道=YEAR(A1) & "-" & TEXT(MONTH(A1), "00") & "-" & TEXT(DAY(A1), "00")在这种情况下我可以做很长时间。我想知道更一般的情况。
日期不应该只是以某种格式显示,它实际上应该是一个字符串。对于查看文件的人来说,这没有什么区别,但是在其他公式中使用它时,它确实如此。
我可以用 VBA 写一个 UDF 来解决这个问题,但我不能在这个文档中使用 VBA。
我不在乎更改月份的名称等。如果月份的名称是 June 或 Juni,这取决于语言环境。
我想强调的是,该问题是由 PC 的语言环境引起的 - 而不是由于 MS Office 版本的 GUI 语言。在上面的例子中,Excel 的 GUI 和公式在两个例子中都是英文的;我刚刚更改了机器上的语言环境。
非常感谢
我的 python 项目中有pytest单元测试,每次推送到 github 时都会运行该测试。最近,(windows, python 3.9) 和 (windows, python 3.10) 上的测试即使在 6 小时后也没有完成,我试图找出原因。
对于上下文:
这不仅仅是 python 版本,因为 python 3.9 和 3.10 在 mac 和 linux 上完成。另外,它不仅仅是 Windows 版本,因为 Windows 已经完成了 python 3.8。他们都最多在 1 小时内完成。
在本地,使用 python 3.9 的 Windows 在 <1 小时内完成。在全新的 conda 虚拟环境中也是如此。
即使推送以前不会造成问题的代码版本,现在也会遇到超时。所以我认为这不是我的代码中的东西,而是依赖项或 github 操作的设置方式(?)。我对此了解不够,无法做出明智的评估。
非常感谢任何调试方面的帮助。
编辑:我查看了 3 个 Windows 案例中的每一个的安装日志并进行了比较。以下是差异:
{'missing': {'typing-extensions': {'38': '4.4.0', '39': '4.4.0'}},
'different': {'setuptools': {'38': '56.0.0', '39': '58.1.0', '310': '63.2.0'}}}
Run Code Online (Sandbox Code Playgroud)
如果这是罪魁祸首,我会感到惊讶setuptools- 它不是只在安装软件包时使用吗?此外,Mac 上的 3.9 …
我正在尝试向每个对象都可以访问的对象数组添加一个函数,但不需要将它们分别添加到每个对象中.
让我举个简短的例子.
假设我有一个包含类似对象的数组,每个对象都有一个属性x和一个属性y:
var objects = [{x:1, y:2},
{x:0, y:5},
{x:3, y:14}
];
Run Code Online (Sandbox Code Playgroud)
我想计算任何对象的x和的总和y.
第一种方法:
为了计算给定对象的总和,可以将此对象传递给预定义函数,如下所示:
function xySum1(o) {return o.x + o.y;}
objects[0].x //--> returns 1
objects[0].y //--> returns 2
xySum1(objects[0]) //--> returns 3
Run Code Online (Sandbox Code Playgroud)
这是非常丑陋和不令人满意的,因为访问x和y属性是不同的.此外,我的代码位于不同的位置,并且该函数xySum1不易被识别为被创建以对数组中的对象进行操作.
第二种方法:
可以循环遍历数组并将函数作为属性添加到每个对象:
for (var i=0; i < objects.length; i++) {
objects[i].xySum2 = function() {return this.x + this.y;};
}
Run Code Online (Sandbox Code Playgroud)
现在,总和是通过
objects[0].x //--> returns 1
objects[0].y //--> returns 2
objects[0].xySum2() //--> returns 3
Run Code Online (Sandbox Code Playgroud)
这要好得多.
问题
但是,这种方法存在问题.首先,当我向数组添加一个新元素时
objects.push({x:5,y:21}); …Run Code Online (Sandbox Code Playgroud) 我想将pandas.Series每小时DatetimeIndex到每月的值聚合起来 - 同时考虑到午夜的偏移。
考虑以下跨度约为 1.5 个月的(统一)时间序列。
import pandas as pd
hours = pd.Series(1, pd.date_range('2020-02-23 06:00', freq = 'H', periods=1008))
hours
# 2020-02-23 06:00:00 1
# 2020-02-23 07:00:00 1
# ..
# 2020-04-05 04:00:00 1
# 2020-04-05 05:00:00 1
# Freq: H, Length: 1000, dtype: int64
Run Code Online (Sandbox Code Playgroud)
我想将这些总结为几个月,同时考虑到在此用例中这些日子从 06:00 开始。结果应该是:
2020-02-01 06:00:00 168
2020-03-01 06:00:00 744
2020-04-01 06:00:00 96
freq: MS, dtype: int64
Run Code Online (Sandbox Code Playgroud)
我怎么做??
我可以在考虑偏移量的同时使用以下offset参数聚合到天数:
2020-02-01 06:00:00 168
2020-03-01 06:00:00 …Run Code Online (Sandbox Code Playgroud)如果我无法更改超类的代码,有没有办法包装超类的所有方法?
作为一个最小的工作示例,考虑这个基类Base,它有许多返回自身新实例的方法,以及派生类Child
class Base:
def __init__(self, val):
self.val = val
def newinst_addseven(self):
return Base(self.val + 7)
def newinst_timestwo(self):
return Base(self.val * 2)
# ...
class Child(Base):
@property
def sqrt(self):
return math.sqrt(self.val)
Run Code Online (Sandbox Code Playgroud)
这里的问题是调用返回, 而不是 的childinstance.newinst_addseven()实例。BaseChild
有没有办法包装Base类的方法以强制返回该类型的值Child?
有了这样的包装:
def force_child_i(result):
"""Turn Base instance into Child instance."""
if type(result) is Base:
return Child(result.val)
return result
def force_child_f(fun):
"""Turn from Base- to Child-instance-returning function."""
def wrapper(*args, **kwargs):
result = fun(*args, **kwargs)
return force_child_i(result) …Run Code Online (Sandbox Code Playgroud) 我有2个pandas DataFrame小号act和exp我想结合成一个单一的数据帧df:
import pandas as pd
from numpy.random import rand
act = pd.DataFrame(rand(3,2), columns=['a', 'b'])
exp = pd.DataFrame(rand(3,2), columns=['a', 'c'])
Run Code Online (Sandbox Code Playgroud)
act #have
a b
0 0.853910 0.405463
1 0.822641 0.255832
2 0.673718 0.313768
exp #have
a c
0 0.464781 0.325553
1 0.565531 0.269678
2 0.363693 0.775927
Run Code Online (Sandbox Code Playgroud)
Dataframedf应该包含比actand多一个列索引级别exp,并且每个都包含在自己的级别 0 标识符下,如下所示:
df #want
act exp
a b a c
0 0.853910 0.405463 0.464781 0.325553
1 0.822641 0.255832 0.565531 …Run Code Online (Sandbox Code Playgroud)