小编Mag*_*ero的帖子

为什么我们在隐式查找特殊方法时绕过实例属性?

来自Python文档中\xe2\x80\x98数据模型\xe2\x80\x99章节的\xe2\x80\x98新样式类的特殊方法查找\ xe2\x80\x99部分(粗体强调是我的):

\n
\n

对于新式类,只有在 object\xe2\x80\x99s 类型上定义特殊方法的隐式调用才能保证正确工作,而不是在 object\xe2\x80\x99s 实例字典中定义。这种行为就是以下代码引发异常的原因(与旧式类的等效示例不同):

\n
>>> class C(object):\n...     pass\n...\n>>> c = C()\n>>> c.__len__ = lambda: 5\n>>> len(c)\nTraceback (most recent call last):\n  File "<stdin>", line 1, in <module>\nTypeError: object of type \'C\' has no len()\n
Run Code Online (Sandbox Code Playgroud)\n

此行为背后的基本原理在于由所有对象(包括类型对象)实现的许多特殊方法,例如__hash__()和\n 。__repr__()如果这些方法的隐式查找\n使用传统的查找过程,则在类型对象本身上调用时它们将失败:

\n
>>> 1 .__hash__() == hash(1)\nTrue\n>>> int.__hash__() == hash(int)\nTraceback (most recent call last):\n  File "<stdin>", line 1, in <module>\nTypeError: descriptor \xe2\x80\x99__hash__\xe2\x80\x99 of \xe2\x80\x99int\xe2\x80\x99 object needs an argument\n
Run Code Online (Sandbox Code Playgroud)\n

错误地尝试以这种方式调用类的未绑定方法有时被称为 \xe2\x80\x98metaclass\nconfusion\xe2\x80\x99,并且可以通过在查找特殊方法时绕过实例来避免:

\n
>>> type(1).__hash__(1) …
Run Code Online (Sandbox Code Playgroud)

python methods function method-call

5
推荐指数
1
解决办法
731
查看次数

Scheme中的return语句是什么?

我正在尝试将这个Python程序翻译成Scheme:

def test(x):
    if x > 1:
        print('foo')
    if x > 10:
        return
    if x == 4: 
        print('bar')


test(1)
test(2)   # prints 'foo'
test(4)   # prints 'foo\nbar'
test(11)  # prints 'foo'
Run Code Online (Sandbox Code Playgroud)

return方案中的声明是什么?

scheme return

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

如何在 shell 脚本中使用 git-stash --keep-index 而不会发生冲突

我正在尝试自动化 git-repository 上的特定操作(typedoc生成 TypeScript 文档的命令);但我需要该命令才能“查看”实际进行的更改。任何未暂存的更改都需要从命令中“隐藏”。

我当前的方法是尝试自动化 git-stash,以便它隐藏任何未跟踪的文件和未暂存的更改,然后运行命令,然后弹出该存储。该脚本的核心内容是:

stash_working=_no

git update-index --refresh
if git diff-index HEAD -- .':!Documentation/'; then
   stash_working=_yes
fi

if [ "$stash_working" != "_no" ]; then
   git stash push --include-untracked --keep-index -m "AUTOMATED STASH" \
       -- .':!Documentation/'
fi

typedoc
typedoc_exit_status=$?

if [ "$stash_working" != "_no" ]; then
   git stash pop
fi

exit $typedoc_exit_status
Run Code Online (Sandbox Code Playgroud)

不幸的是,这并没有按预期工作:特别是,尽管“未包含”在存储中,但存储的更改......在弹出时会干扰自身(?)。例如,如果分阶段内容(我确实想要在文档中看到)包含此行,

 * This is some fake documentation for testing purposes.
Run Code Online (Sandbox Code Playgroud)

...但是有一个未分阶段的更改将其更新为

 * THIS IS A CHANGE TO THAT …
Run Code Online (Sandbox Code Playgroud)

git shell scripting git-stash

5
推荐指数
0
解决办法
415
查看次数

锁对象只能通过继承在进程之间共享

我正在multiprocessing.Pool对象中使用该类并尝试执行以下操作:

from multiprocessing import Lock, Pool

class A:
    def __init__(self):
        self.lock = Lock()
        self.file = open('test.txt')
    def function(self, i):
        self.lock.acquire()
        line = self.file.readline()
        self.lock.release()
        return line
    def anotherfunction(self):
        pool = Pool()
        results = pool.map(self.function, range(10000))
        pool.close()
        pool.join()
        return results
Run Code Online (Sandbox Code Playgroud)

但是,我收到一个运行时错误,指出锁对象只能通过继承在进程之间共享。我对 Python 和多处理相当陌生。我怎样才能走上正确的轨道?

python pool multiprocessing

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

如何在 eslint.config.js 中启用推荐的 ESLint 规则?

I\xe2\x80\x99m 尝试使用新的 ESLint 配置文件eslint.config.js (因为旧的 ESLint 配置文件.eslintrc.* 和 package.json 将在 ESLint 9.0.0 中弃用)。推荐的 ESLint 规则是由"extends": "eslint:recommended"旧配置文件中的属性启用的,但该属性在依赖于语句的新配置文件中不再存在import

\n

所以我import在 eslint.config.js 中尝试了这个:

\n
import config from \'eslint-config-standard\';\n\nexport default [\n  {\n    rules: config.rules\n  }\n];\n
Run Code Online (Sandbox Code Playgroud)\n

但我得到了这个TypeError

\n
$ npm exec eslint .\nOops! Something went wrong! :(\n\nESLint: 8.39.0\n\nTypeError: Key "rules": Key "import/export": Could not find plugin "import".\n
Run Code Online (Sandbox Code Playgroud)\n

如何解决这个问题呢?

\n

javascript eslint

5
推荐指数
1
解决办法
1206
查看次数

如何使用 Poetry 发布到 Azure Devops PyPI 源?

我正在尝试设置 Azure Devops 以使用 Poetry 发布到 PyPI 提要。

我了解 Twine 身份验证并将凭据存储到 Azure Key Vault。但是有没有更直接的方法呢?像这样的东西:

- script: |
    source .venv/bin/activate
    poetry build
  displayName: Build wheel
- script: |
    source .venv/bin/activate
    poetry publish -u USER -p PASS
  displayName: Publish wheel
Run Code Online (Sandbox Code Playgroud)

python azure-devops python-poetry

4
推荐指数
2
解决办法
1864
查看次数

为什么带大括号的复制初始化会省略复制/移动构造?

这是一个 C++ 14 程序,用于比较直接初始化(no =)和复制初始化=):*

#include <iostream>


struct A {
    A(int) { std::cout << "A(int)" << std::endl; }
    A(A&) { std::cout << "A(A&)" << std::endl; }
    A(A&&) { std::cout << "A(A&&)" << std::endl; }
};


int main() {
    A a(1);     // direct initialisation
    A b{1};     // direct initialisation
    A c = 1;    // copy initialisation
    A d = (1);  // copy initialisation
    A e = {1};  // copy initialisation
}
Run Code Online (Sandbox Code Playgroud)

编译程序复制省略 …

c++ initialization language-lawyer copy-elision c++14

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

即将超出范围的变量是左值还是x值?

当一个即将超出范围的变量被返回或抛出时,它的资源可以被重用,即它可以从 中移出,如下面的 C++ 程序所示:

#include <iostream>

struct X {
    X() {
        std::cout << "X()\n";
    }
    
    X(X&&) {
        std::cout << "X(X&&)\n";
    }
    
    ~X() {
        std::cout << "~X()\n";
    }
};

X f() {
    X x;
    std::cout << "return\n";
    return x;
}

int main() {
    try {
        X x = f();
        std::cout << "throw\n";
        throw x;
    } catch (...) {
        std::cout << "catch\n";
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译(我们使用标志关闭复制/移动省略-fno-elide-constructors)、链接和执行:

clang++ -std=c++17 -O2 -Wall -pedantic -pthread -fno-elide-constructors\
main.cpp && ./a.out
Run Code Online (Sandbox Code Playgroud)

输出: …

c++ lvalue language-lawyer move-semantics xvalue

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

在Windows上使用os.path进行POSIX路径操作

我在Windows上使用Paramiko来访问远程SFTP服务器.我需要在远程路径上做一些工作,比如os.path.join,os.path.commonprefix等等.由于我的主机平台是Windows,所有路径操作都带有\分隔符,但我需要POSIX风格的路径.

有没有办法在Windows上使用Python内置的POSIX路径操作?

python windows posix path

3
推荐指数
1
解决办法
3423
查看次数

为什么 __get__ 拥有一个所有者而 __set__ 和 __delete__ 没有?

来自 Python数据模型文档

object.__get__(self, instance, owner=None)

调用以获取所有者类的属性(类属性访问)或该类的实例的属性(实例属性访问)。可选owner参数是所有者类,而instance属性是通过其访问的实例,或者None是通过owner.

此方法应返回计算出的属性值或引发AttributeError异常。

PEP 252 指定可以__get__()使用一个或两个参数调用。Python 自己的内置描述符支持这个规范;但是,某些第三方工具可能具有需要两个参数的描述符。__getattribute__()无论是否需要,Python 自己的实现总是传入这两个参数。

object.__set__(self, instance, value)

调用以将instance所有者类的实例上的属性设置为新值 value。

请注意,将描述符的种类添加__set__()__delete__()更改为“数据描述符”。有关更多详细信息,请参阅调用描述符。

object.__delete__(self, instance)

调用以删除instance所有者类的实例上的属性。

为什么__get__需要一段owner时间__set____delete__没有?

这是否意味着当描述符同时提供__get__和时__set__

  • 我们可以得到一个属性,无论它是属于所有者类的实例还是属于所有者类,
  • 我们可以在属性属于所有者类的实例时设置和删除属性,但在属于所有者类时不能设置和删除属性?

我的问题实际上是这个问题的一部分。

python attributes datamodel python-descriptors

3
推荐指数
1
解决办法
508
查看次数