小编Kyl*_*tan的帖子

如何为降序值编写Python排序键函数

在最近的Python版本中,将函数传递给sort()前一个cmp函数的举动使得我对某些对象执行复杂的排序变得更加棘手.

例如,我想用一组字符串tie-breaker字段对从最新到最旧的一组对象进行排序.所以我希望日期顺序相反,但字符串按其自然顺序排列.使用比较函数,我可以反转日期字段与字符串字段的比较.但是通过关键功能,我需要找到一些方法来反转/反转日期或字符串.

使用数字很简单(虽然难看) - 只是从某些东西中减去它们 - 但我是否必须找到类似的日期(从另一个日期减去它们并比较timedeltas?)和字符串(...我不知道我如何以与语言环境无关的方式改变他们的顺序).

我知道functools.cmp_to_key()它的存在,但它被描述为"主要用作转换为Python 3的程序的转换工具,其中不再支持比较函数".这意味着我应该能够用关键方法做我想做的事 - 但是怎么做?

python sorting

30
推荐指数
4
解决办法
1万
查看次数

如何在C++中实现通用回调

原谅我对这个基本问题的无知,但我已经习惯了使用Python,这种事情是微不足道的,我已经完全忘记了如何在C++中尝试这一点.

我希望能够将回调传递给在后台执行缓慢进程的函数,并在进程完成后稍后调用它.此回调可以是自由函数,静态函数或成员函数.我也希望能够在那里注入一些任意的参数用于上下文.(即,在某种程度上实现一个非常差的人的协程.)最重要的是,这个函数将始终采用std :: string,这是进程的输出.我不介意这个参数在最终回调参数列表中的位置是否固定.

我觉得答案将涉及boost :: bind和boost :: function但是我无法确定为了创建任意的callables而需要的精确调用(同时将它们调整为只需要一个字符串),将它们存储在后台进程中,并使用string参数正确调用callable.

c++ boost boost-bind

21
推荐指数
1
解决办法
1万
查看次数

当std :: make_shared分配的内存被释放时,std :: weak_ptrs是否会受到影响?

如果我调用std::make_shared<T>(而不是仅仅shared_ptr<T>显式分配),那么出于性能原因,我希望引用计数在T的实例旁边分配.一切都很好.

但是如果我有weak_ptr引用相同对象的实例,可能他们需要访问该引用计数,以了解该对象是否仍然存在.

因此,当T的实例的最后一个shared_ptr被销毁时,对系统的天真理解意味着它不能释放存储T的内存,因为weak_ptrs仍然需要访问该计数.

似乎有一个单独的弱引用计数器,理论上它可以与T的实例分开保存,这样T可以被破坏,内存释放,而弱引用仍然存在.但后来我们又回到了两个单独的分配,挫败了它的好处make_shared.

我想我在这里误解了一些东西.std::make_shared当存在弱引用时,如何释放为构造的实例分配的内存?

c++ memory

21
推荐指数
1
解决办法
1316
查看次数

在C#中缓冲字节数据

我的应用程序从TCP套接字读取字节并需要缓冲它们,以便我可以稍后从中提取消息.由于TCP的性质,我可能在一次读取中得到部分或多个消息,因此在每次读取之后,我想检查缓冲区并提取尽可能多的完整消息.

因此,我想要一个允许我执行以下操作的课程:

  • 将任意byte []数据附加到它
  • 在不消费内容的情况下检查内容,特别是检查内容量并搜索某个字节或字节的存在
  • 以byte []的形式提取和使用部分数据,而将其余部分留在那里以供将来读取

我希望我想要的可以用.NET库中的一个或多个现有类来完成,但我不确定哪些类.System.IO.MemoryStream看起来接近我想要的,但是(a)不清楚它是否适合用作缓冲区(读取数据是否从容量中删除?)和(b)读写似乎发生在同一个地方 - "流的当前位置是下一次读取或写入操作可能发生的位置." - 这不是我想要的.我需要写到最后并从前面阅读.

.net c#

17
推荐指数
2
解决办法
2万
查看次数

Visual Studio 2012:C++编译器忽略用户指定的包含目录

我有一个常见的错误fatal error C1083: Cannot open include file: 'afxres.h': No such file or directory.搜索引擎显示了大量的点击,但没有一个建议的解决方案适合我.

通常这似乎是路径的问题.因此,我确保安装了相关的库,并找到了该文件.使用绝对路径作为#include工作正常:

#include "C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\atlmfc\include\afxres.h"

但是,如果我将目录(C:\ Program Files(x86)\ Microsoft Visual Studio 11.0\VC\atlmfc\include)添加到项目设置(或Microsoft.Cpp.Win32.User属性表),并尝试此行:

#include "afxres.h"

我再次收到错误C1083.然而Visual Studio显然可以找到该文件 - 如果我右键单击文件名并选择"打开文档'afxres.h'",它会立即打开它!

为什么Visual Studio会忽略我指定的#include路径?我以类似方式包含的其他#include路径完美运行.

目录明确包含在构建设置中

c++ mfc visual-studio-2012

9
推荐指数
1
解决办法
7476
查看次数

恢复损坏的合并并使用Gi​​t重新应用选定的提交

我们最近遇到一个问题,合并以某种方式导致所有更改导致一个父在合并提交中被撤消,并且在该点之后已经应用了几个提交.所有这些都被推送到我们的共享源存储库.我希望能够恢复错误的合并并重新应用其他更改集.最简单的方法是什么?

ASCII艺术示例:

    A-B-C-D
   /       \
P-Q         M-X-Y-Z
   \       /
    1-2-3-4

  ---time--->
Run Code Online (Sandbox Code Playgroud)

提交M包括更改A到D,但所有更改1到4都被该提交还原.

我希望能够恢复,例如.更改集4,并重新应用AD和X更改为Z,理想情况下无需手动重做每个更改.

如果这是不可能的,我想听听最好的解决方法 - 例如.也许从4分支,再次合并D小心不要破坏任何东西,然后手动重新应用X到Z?

(一个理想的情况是知道如何使用TortoiseGit,虽然只知道命令行应该允许我推断其余的.)

git merge tortoisegit

8
推荐指数
1
解决办法
5527
查看次数

通用方法无法调用正确的重载

注意:我正在使用Mono环境,如果这有所不同.

我正在写一些测试,为了帮助我,我有以下通用方法:

static MemoryStream writeValue<T>(T inVal)
{
  MemoryStream ms = new MemoryStream();
  BinaryWriter bw = new BinaryWriter(ms);
  encode_any(bw, inVal);
  return ms;
}
Run Code Online (Sandbox Code Playgroud)

我的想法是,这会调用我的一个encode_any重载,它会委托特定于类型的方法:

public static void encode_any(BinaryWriter writer, Int32 val) { encode_int32(writer, val); }
public static void encode_any(BinaryWriter writer, Int64 val) { encode_int64(writer, val); }
public static void encode_any(BinaryWriter writer, Float val) { encode_float(writer, val); }
...etc...
public static void encode_any(BinaryWriter writer, bool val) { encode_bool(writer, val); }
Run Code Online (Sandbox Code Playgroud)

我想这样做的原因是我可以在每种情况下调用正确的实现,而不需要几个版本的'writeValue',并且在选择要调用的encode_函数之前不检查每个项的运行时类型.

然而,似乎编译器试图解决writeValue的重载而不知道T将是什么类型,所以我得到这个错误:

错误CS1502:'BinarySerialiser.encode_any(System.IO.BinaryWriter,bool)'的最佳重载方法匹配有一些无效的参数错误CS1503:参数'#2'无法将'T'表达式转换为'bool'类型

我注意到这不是特别关于bool - 如果我重新排列我的encode_any函数的顺序,它总是尝试使用最后一个.也许它只是尝试每一个,然后只有当它用完替代品时才会发出错误.

这种代码在C++下可以正常工作,writeValue只有在知道T时才会编译,但这似乎不是这种情况,我怀疑这是因为C#在运行时处理泛型类型.

我可以改变我的方法来完成这项工作,如果是这样的话?

.net c# generics mono

6
推荐指数
1
解决办法
1569
查看次数

在Python的logging.config模块中使用自定义格式化程序类

我有以下日志记录类,在代码中指定为格式化程序时工作正常.它通过在要记录的消息的开头添加字符串来扩展现有格式化程序,以帮助显示消息的重要性.(我不只是%(levelname)s在格式字符串中使用,因为我不想显示DEBUG或INFO前缀.)

class PrependErrorLevelFormatter(logging.Formatter):
    def __init__(self, default):
        self._default_formatter = default
    def format(self, record):
        if record.levelno == logging.WARNING:
            record.msg = "[WARNING] " + record.msg
        elif record.levelno == logging.ERROR:
            record.msg = "[ERROR] " + record.msg
        elif record.levelno == logging.CRITICAL:
            record.msg = "[CRITICAL] " + record.msg
        return self._default_formatter.format(record)
Run Code Online (Sandbox Code Playgroud)

现在我希望能够通过logging.config.fileConfig()加载的配置文件来分配它.我试过这样的语法:

[formatter_PrependErrorLevelFormatter]
format=%(asctime)s  %(message)s
datefmt=%X
class=PrependErrorLevelFormatter
Run Code Online (Sandbox Code Playgroud)

不幸的是我得到解决这个类的错误:

  File "C:\Python27\lib\logging\config.py", line 70, in fileConfig
    formatters = _create_formatters(cp)
  File "C:\Python27\lib\logging\config.py", line 127, in _create_formatters
    c = _resolve(class_name)
  File "C:\Python27\lib\logging\config.py", line 88, in _resolve
    found = __import__(used) …
Run Code Online (Sandbox Code Playgroud)

python logging python-2.7

4
推荐指数
1
解决办法
9479
查看次数

分布式交易的成语或算法?

想象一下,您在不同的系统上有2个实体,并且需要根据与其中一个或两个相关的信息执行某种更改其中一个或两个的事务,并且要求对这两个实体的更改都将完成,或者它们都不会.

简单的例子,基本上必须在2个独立的硬件上运行2行:

my_bank.my_account -= payment
their_bank.their_account += payment
Run Code Online (Sandbox Code Playgroud)

据推测,存在专门针对这种情况存在的算法或习语,在存在对其他尝试访问相同值的情况下正确地工作(对于某些可预测的正确定义).的两阶段提交协议似乎是一种这样的方法.是否有更简单的替代方案,可能有更多限制?(例如,也许他们要求没有系统可以完全关闭或无法响应.)或者可能有更复杂的系统在某种程度上更好?关于此事,是否有标准或备受好评的文本?

database distributed distributed-transactions

2
推荐指数
1
解决办法
634
查看次数

c ++矢量多个值

我是c ++的新手,但是有半年的Java se/ee7工作经验.

我想知道如何将3个值放入vector<string> 示例中:vector<string, string, string>或者只是vector<string, string> 为了避免使用3个向量.

vector<string> questions;
vector<string> answers;
vector<string> right_answer;

questions.push_back("Who is the manufacturer of Mustang?");
answers.push_back("1. Porche\n2. Ford \n3. Toyota");
right_answer.push_back("2");

questions.push_back("Who is the manufacturer of Corvette?");
answers.push_back("1. Porche\n2. Ford \n3. Toyota \n4. Chevrolette");
right_answer.push_back("4");


for (int i = 0; i < questions.size(); i++) {
    println(questions[i]);
    println(answers[i]);

    if (readInput() == right_answer[i]) {
        println("Good Answer.");
    } else {
        println("You lost. Do you want to retry? y/n");
        if(readInput() == "n"){
            break;
        }else{ …
Run Code Online (Sandbox Code Playgroud)

c++ stdvector

-2
推荐指数
1
解决办法
583
查看次数