RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-437332

Dark Space's questions

Martin Hope
Dark Space
Asked: 2024-01-06 01:53:38 +0000 UTC

@property 中的下划线有什么用?

  • 5

大家好。请帮我弄清楚。这是代码:

class Person:
    def __init__(self):
        self.age = 0
 
    @property
    def age(self):
        return self.__age
 
    @age.setter
    def age(self, value):
        if value < 0:
            raise ValueError("Age cannot be negative")
        self.__age = value
        
t = Person()
t.age = 12
print(t.age) # 12

它工作正常,但让我困惑的是:该属性Person被称为age,并且 getters 和 setters 与 交互__age。我明白__它被替换为类名,结果是_Person__age。实际上,代码中发生的是这样的情况:

print(dir(t))

# ['_Person__age', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age']

但是,如果没有皮屑,我会收到错误:

class Person:
    def __init__(self):
        self.age = 0
 
    @property
    def age(self):
        return self.age
 
    @age.setter
    def age(self, value):
        if value < 0:
            raise ValueError("Age cannot be negative")
        self.age = value
        
t = Person()
t.age = 12
print(t.age)


File "main.py", line 47, in age
    if value < 0:
RecursionError: maximum recursion depth exceeded in comparison

几个问题:

  1. 如果它们相同,为什么我们需要一个带有下划线的属性:

    t.age = 12
    print(t.age) # 12
    print(t._Person__age) # 12

它只vars()输出{'_Person__age': 12}

  1. 为什么我会收到没有下划线的错误?

先感谢您

python
  • 1 个回答
  • 53 Views
Martin Hope
Dark Space
Asked: 2023-12-31 23:16:31 +0000 UTC

如何配置pygame图形重绘?

  • 5

我向大家致以问候,并祝贺你们即将到来的假期。问题如下:
我计划创建一个窗口,您可以在其中使用箭头控制图形(我尽可能简化了这个想法)。正确创建基于数组的字段。应该移动的身影也出现了。但是,当您尝试将其移动到场地上时,会使用不同的坐标绘制一个新图形,而旧图形仍保留在其位置上。如何让点击后旧图消失?
程序代码:

import pygame

pygame.init()
pygame.display.set_caption('Миникарта')

game_screen = pygame.display.set_mode((400, 400))

gamer_x = 10
gamer = pygame.Surface((gamer_x, 100))
gamer.fill((250, 190, 4))

run = True
while run:
    pygame.time.delay(30)
    key_press = pygame.key.get_pressed()
    gamer_x += 1
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    game_screen.blit(gamer, (gamer_x, 100))
    pygame.display.update()

先感谢您

PS 我删除了负责按下的代码,并在x坐标上做了一些简单的增加

python
  • 1 个回答
  • 13 Views
Martin Hope
Dark Space
Asked: 2023-12-20 16:32:11 +0000 UTC

AttributeError:模块“pkgutil”没有属性“ImpImporter”。您指的是: 'zipimporter'?

  • 5

我正在尝试将其安装selenium在从 github 克隆的新项目中。当我尝试使用PyCharm中的内置Python 包时,我得到以下信息:

AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'?

操作系统:Ubuntu 22
Python版本:3.12.1

SO上已经有这样一个问题,但是那里的作者有Windows 11,尽管有 Linux 的答案,但由于某种原因,他们没有帮助我。我试过:

  • pip install --upgrade setuptools
  • python -m pip install --user virtualenv
  • virtualenv your_virtual_environment --python=python3.12(随后激活)
  • python3.12 -m pip install --upgrade setuptools
    乃至
  • sudo apt install python3.12-dev

我并不是特别精通 Linux,但我注意到当我切换到 3.10 版本(系统上最初安装的版本)时,一切正常。但安装 3.12 版本对我来说很重要。
先感谢您

更新:

完整错误文本:

Defaulting to user installation because normal site-packages is not writeable

ERROR: Exception:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/pip/_internal/cli/base_command.py", line 165, in exc_logging_wrapper
    status = run_func(*args)
             ^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/pip/_internal/cli/req_command.py", line 205, in wrapper
    return func(self, options, args)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/pip/_internal/commands/install.py", line 285, in run
    session = self.get_default_session(options)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/pip/_internal/cli/req_command.py", line 75, in get_default_session
    self._session = self.enter_context(self._build_session(options))
                                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/pip/_internal/cli/req_command.py", line 89, in _build_session
    session = PipSession(
              ^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/pip/_internal/network/session.py", line 282, in __init__
    self.headers["User-Agent"] = user_agent()
                                 ^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/pip/_internal/network/session.py", line 157, in user_agent
    setuptools_dist = get_default_environment().get_distribution("setuptools")
                      ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/pip/_internal/metadata/__init__.py", line 24, in get_default_environment
    from .pkg_resources import Environment
  File "/usr/lib/python3/dist-packages/pip/_internal/metadata/pkg_resources.py", line 9, in <module>
    from pip._vendor import pkg_resources
  File "/usr/lib/python3/dist-packages/pip/_vendor/pkg_resources/__init__.py", line 2164, in <module>
    register_finder(pkgutil.ImpImporter, find_on_path)
                    ^^^^^^^^^^^^^^^^^^^
AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. Did you mean: 'zipimporter'?

更新2:

当我在此 PC 上创建新项目时,在 3.12 上安装软件包可以正常工作,但如果我从 Git 克隆,则会出现上述问题

python
  • 1 个回答
  • 42 Views
Martin Hope
Dark Space
Asked: 2023-12-15 21:18:49 +0000 UTC

为什么没有 __iter__ 和 __next__ 的对象可以被迭代?

  • 10

一个理解语言“内部运作方式”的问题。代码如下:

class NoIter():
    def __init__(self): 
        self.some = [1, 2, 3, 4, 5]
        
    def __getitem__(self, index):
        return self.some[index]
        
t = NoIter()        
        
for item in t:
    print(item)

结论:

    1
    2
    3
    4
    5

问题:

  • 为什么一个对象可以被迭代,即使它不包含__iter__and __next__?
  • 为什么__getitem__在迭代过程中隐式调用它?
python
  • 2 个回答
  • 89 Views
Martin Hope
Dark Space
Asked: 2023-12-09 22:39:00 +0000 UTC

默认值和传递的值不一样吗?

  • 7

只是为了好玩,我决定尝试写一些类似的@cache东西functools。装饰器检查是否已经使用相同的参数执行了相同的函数。如果是,则返回已经计算的结果。

def decor(func):
    cashe = dict()
    def wrapper(*args, **kwargs):
        key = f"{func}"
        for item in args:
            key += str(hash(str(item)))
        for key_item in kwargs:
            key += str(hash(str(key_item)))

        if key not in cashe:
            print('Создал!')
            result = func(*args, **kwargs)
            cashe[key] = result
        else:
            print('Взял из кеша!')
            result = cashe[key]
        return result
    return wrapper

总的来说,我认为我们可以坐下来让它更简洁/更快/更短,但这不是现在的重点。

当我使用

@decor
def check(a, b, c=0):
    return a + b + c


check(1, 5) # Создал 
check(1, 5) # Взял из кеша

一切都按我的预期进行,但是当

check(1, 5, 0) # Создал
check(1, 5) # Создал

为什么会发生这种情况?c毕竟,在这两种情况下它都是不可变的并且都等于 0,但是为什么这些函数被认为是不同的呢?

python
  • 1 个回答
  • 72 Views
Martin Hope
Dark Space
Asked: 2023-12-04 18:32:32 +0000 UTC

元组中列表的 += 和 .append 之间的区别

  • 8

尝试了解元组中列表的 += 和 .append() 方法之间的差异。提出这个问题是为了了解“内部厨房”,而不是为了寻找实际应用。示例代码:

def add_func():
    a = (1, 2, [1, 2])
    a[-1] += [3] # в список значение добавится, но потом падает ошибка

第二个版本:

 def append_func(): 
    a = (1, 2, [1, 2])
    a[-1].append(3) # в данном случае всё корректно отработает 

查看字节码后,我发现有些行有所不同:

print(dis.dis(add_func))
print('--------------')
print(dis.dis(append_func))

  4           0 LOAD_CONST               1 (1)
              2 LOAD_CONST               2 (2)
              4 LOAD_CONST               1 (1)
              6 LOAD_CONST               2 (2)
              8 BUILD_LIST               2
             10 BUILD_TUPLE              3
             12 STORE_FAST               0 (a)

  5          14 LOAD_FAST                0 (a)
             16 LOAD_CONST               3 (-1)
             18 DUP_TOP_TWO
             20 BINARY_SUBSCR
             22 LOAD_CONST               4 (3)
             24 BUILD_LIST               1
             26 INPLACE_ADD              # Кажется, это "отголоски" __iadd__
             28 ROT_THREE
             30 STORE_SUBSCR
             32 LOAD_CONST               0 (None)
             34 RETURN_VALUE
--------------
  8           0 LOAD_CONST               1 (1)
              2 LOAD_CONST               2 (2)
              4 LOAD_CONST               1 (1)
              6 LOAD_CONST               2 (2)
              8 BUILD_LIST               2
             10 BUILD_TUPLE              3
             12 STORE_FAST               0 (a)

  9          14 LOAD_FAST                0 (a)
             16 LOAD_CONST               3 (-1)
             18 BINARY_SUBSCR
             20 LOAD_METHOD              0 (append)
             22 LOAD_CONST               4 (3)
             24 CALL_METHOD              1
             26 POP_TOP
             28 LOAD_CONST               0 (None)
             30 RETURN_VALUE

字节码的差异让我认为我理解了这个问题,但在那之后我决定阅读SO。
引用这个问题:

+= 是一个赋值。当你使用它时,你实际上是在说“some_list2= some_list2+['something']”。分配涉及重新绑定,因此:

同时他们__iadd__ 在这里写到:

从 API 的角度来看,iadd应该用于就地修改可变对象(返回已变异的对象),而add应该返回某个新的实例。

还有L. Ramalho 的书《Python - to the heights of mastery》中的一句话:

如果左侧的变量与不可变对象关联,并且可以就地修改可变对象,则复合赋值(运算符 +=、*= 等)会创建一个新对象。

坦白说,我对此感到困惑,并发现其中有很多矛盾。如果+=“就地”更改对象,为什么会发生错误?

PS我也不太理解STORE_FAST文档中字节码中的一行:

将 STACK.pop() 存储到本地 co_varnames[var_num] 中。

python
  • 2 个回答
  • 94 Views
Martin Hope
Dark Space
Asked: 2023-11-30 22:50:59 +0000 UTC

** 和 | 之间的区别 在 Python 字典中

  • 7

有这样的代码:

first = {'a': 1, 'b': 2}
second = {'c': 3}

您需要将两本词典收集到一本结果词典中。我通常通过以下方式做到这一点**:

result = {**first, **second} 

但最近我遇到了这个选项

result = first | second

据我所知,这是一个用于组合的运算符。但它们之间有什么区别呢?一种情况发生什么id变化,另一种情况又发生什么变化。告诉我,也许还有其他一些差异?在哪里使用什么有区别吗?

python
  • 1 个回答
  • 44 Views
Martin Hope
Dark Space
Asked: 2023-11-27 16:33:44 +0000 UTC

为什么 += 在 return 和 print() 中不起作用?

  • 7

用下面的代码

class Num():
    def __init__(self, val): 
        self.val = val
        
    def __iadd__(self, other): 
        return Num(self.val + other.val)
        
        
a = Num(4)
b = Num(6)

print(a += b)

我遇到了以下错误:

File "main.py", line 12
    print(a += b)
            ^
SyntaxError: invalid syntax

如果+=更改为+,则一切正常,但由于+=某种原因会发生错误。同时,在某些功能上return a += b也会产生同样的问题。

问题:为什么返回值会+=出错?__iadd__

python
  • 3 个回答
  • 92 Views
Martin Hope
Dark Space
Asked: 2023-11-21 18:39:55 +0000 UTC

如何将字体文件添加到 auto-py-to-exe 版本中?

  • 5

我正在编写一个应用程序dearpygui,有一个地方可以连接自定义字体来支持西里尔字母。在代码中它看起来像这样:

with dpg.font_registry():
    with dpg.font("./LiteralRegular.otf", 18, default_font=True, tag="Default font") as f:
        dpg.add_font_range_hint(dpg.mvFontRangeHint_Cyrillic)

当然,在项目文件夹中也有相同的LiteralRegular.otf

- main.py
- LiteralRegular.otf

从 VSCode 或 PyCharm 启动时一切正常,但是当我通过将所有内容编译成 .exe 时 auto-py-to-exe,启动程序时出现错误:

Exception: Error: [1000] Message:   Font file could not be found

我尝试通过使用附加文件指定字体文件来重新启动构建,但结果是相同的。告诉我如何解决这个问题?

python
  • 1 个回答
  • 33 Views
Martin Hope
Dark Space
Asked: 2023-11-15 15:37:26 +0000 UTC

如何将数据从 input_text 传递到另一个元素的回调?

  • 6

大家好。
共有三个模块:Interface、DataManager、 ,General 为了方便理解,我画了一个他们之间交互的图。在此输入图像描述

该界面是用dearpygui编写的,代码如下:

class Interface():    
    def draw_main_window(self, start_programm): 
        with dpg.window(label="Example Window", width=1000, height=500, tag='main_wind'):
            with dpg.tab_bar():
                with dpg.tab(label='Main'):
                    with dpg.group():
                        dpg.add_text(default_value="Last Date")
                        dpg.add_input_text(tag='date_user', no_spaces = True, decimal= True, width=100)
                        dpg.add_button(label="Поиск", callback=start_program, user_data = dpg.get_value('date_user')) 

            dpg.set_primary_window(window='main_wind', value=True)
            dpg.setup_dearpygui()
            dpg.show_viewport()
            dpg.start_dearpygui()
            dpg.destroy_context()

该模块DataManager包含程序的内部结构,目前,为了简化情况,我用一个简单的模块替换了它

class DataManager: 
    def start_program(self, sender, app_data, user_data): 
        print(user_data)
        print(sender)
        print(app_data)

General 类如下所示:

class General():
    def __init__(self, data_manager: DataManager, interface: Interface) -> None:
        self.data_manager = data_manager
        self.interface = interface

    def start_program(self): 
        self.interface.draw_main_window(self.data_manager.start_program)
   

if __name__ == '__main__':
    t = General(SelFlashManager(), GraphInterface())
    t.start_program()

我希望当我单击“搜索”按钮时,文本字段中的数据"date_user"将与 to callbackfrom一起发送start_program,DataManager但这种情况不会发生。
单击按钮后我得到

      # Пустая строка 
31    # id элемента 
None  # Результат 

我怀疑这是由于在窗口初始化时执行了 get_value 函数造成的。我读到有回调调试。但是主事件循环仍然需要在某个地方调用,这样做有点奇怪General,因为整个接口都是在Interface. 告诉我如何确保文本字段中的数据callback(在单击期间)一起进入函数?

python
  • 1 个回答
  • 24 Views
Martin Hope
Dark Space
Asked: 2023-11-07 19:18:38 +0000 UTC

异步运行函数

  • 7

大家好。为了这个想法,我想编写某种控制台秒表。吃

import os
import asyncio
import time
import logging


logging.basicConfig(filename = "mylog.log", level=logging.DEBUG)


class Timer(): 
    def __init__(self) -> None:
        self.minute = 0
        self.seconds = 0
        self.deciseconds = 0


    def add_deciseconds(self): 
        self.deciseconds += 1

        if self.deciseconds >= 10: 
            self.seconds += 1 
            self.deciseconds = 0 

        if self.seconds >= 60: 
            self.seconds = 0 
            self.minute += 1


    def get_time(self):
        return (self.minute, self.seconds, self.deciseconds) 


async def tick(my_timer: Timer):
    my_timer.add_deciseconds()
    os.system("cls") 
    m , s, ss = my_timer.get_time()
    print(f"{m} : {s} : {ss}")

    
async def main(tim): 
    await tick(tim)


if __name__ == '__main__': 

    my_timer = Timer()
    
    while True: 

        start = time.time()
        logging.debug(start)

        asyncio.run(main(my_timer))   

        time.sleep(1)

        end = time.time()
        logging.debug(end)
        logging.debug(end - start)
        logging.debug('------------------')

    

日志和异步已经是解决问题的尝试。
问题:time.sleep(1)等待超过 1 秒。为了进行测试,我打开了这个应用程序,几秒钟后打开了手机上的秒表。大约第二分钟,手机上的秒表开始追上。

我对异步编程不太了解,但我认为输出到时间终端并加一的代码使程序仍然等待,所以我尝试使函数异步。受到文档中模板的启发

日志看起来像这样:

DEBUG:root:1699353460.6091332
DEBUG:asyncio:Using proactor: IocpProactor
DEBUG:root:1699353461.6302617
DEBUG:root:1.0211284160614014 # Разница между старт и стоп больше 1 секунды
DEBUG:root:------------------
DEBUG:root:1699353461.6313007
DEBUG:asyncio:Using proactor: IocpProactor
DEBUG:root:1699353462.666385
DEBUG:root:1.0350842475891113 # Разница между старт и стоп больше 1 секунды
DEBUG:root:------------------
    

我读过各种文章,包括其他人对 SO 的问题(一个例子)。他们说该误差是可以接受的,但他们谈论的误差约为 0.00001 或更小。

我尝试在没有任何计时器的情况下运行循环:

while True: 

    start = time.time()
    logging.debug(start)

    time.sleep(1)

    end = time.time()
    logging.debug(end)
    logging.debug(end - start)
    logging.debug('------------------') 

在这种情况下,日志中的数字已经更加准确

DEBUG:root:1699355102.4560356
DEBUG:root:1699355103.4560683
DEBUG:root:1.000032663345337
DEBUG:root:------------------
DEBUG:root:1699355103.457032
DEBUG:root:1699355104.4571276
DEBUG:root:1.0000956058502197
DEBUG:root:------------------

如果不进行日志记录,计时器的运行速度仍然会慢一些。
我不知道到底是什么减慢了我的程序?

python
  • 2 个回答
  • 57 Views
Martin Hope
Dark Space
Asked: 2023-10-27 18:38:55 +0000 UTC

在字符串中搜索时会忽略字母

  • 5

大家好。有这样一段代码:

import random

ALL_SYMBOLS = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя'

key = list(ALL_SYMBOLS)
random.shuffle(key)
key = ''.join(key)



message = 'Абрикосовый сок после - это лучшее, что может быть'
secret_message = ''


for letter in message: 
    if key.find(letter): 
        new_index = key.find(letter)
        secret_message += ALL_SYMBOLS[new_index]
    else: 
        print(f'Не нашёл символ - {letter}')
        secret_message += letter

print(secret_message)

我正在尝试message使用简单的替换密码进行加密。在此阶段,我忽略空格并期望在加密消息中它们将保留在与原始消息中相同的位置。一切似乎都加密得很好,但有时会漏掉

Не нашёл символ - ь
зщЁгСЫЭЫфЦьяЭЫСяэЫЭцПяяяпжЫяцШЧЮППяяЧжЫяъЫчПжящЦжь

在这种情况下,空格被符号“I”替换,并且由于某种原因没有找到。为什么会发生这种情况?

python
  • 1 个回答
  • 30 Views
Martin Hope
Dark Space
Asked: 2023-09-07 16:20:47 +0000 UTC

控制器如何使用接口?

  • 4

我正在阅读《清洁架构》一书,发现了下图: 在此输入图像描述

我对蓝线以上的部分感兴趣。

书中引用:“控制器将数据包装到一个简单的 Java InputData对象中,并通过InputBoundary接口将其传递给UseCaseInteractor类。”

问题是:

  • 如果控制器的所有方法都是抽象的并且无法创建抽象类的实例,那么控制器如何使用接口并“传递数据”?
  • 是否可以使用 Python 来完成此操作?
  • 您能否给出此类设计的一个小示例或提供材料链接?

没有找到有关 SO 上类似答案的问题的答案。互联网上也有一些文章和其他材料提供了关于什么是接口这一主题的基本信息,但对于这样一个“奇怪”的问题却没有答案

python
  • 1 个回答
  • 46 Views
Martin Hope
Dark Space
Asked: 2023-06-18 03:21:42 +0000 UTC

如何在 dearpygui 中调整图像大小?

  • 6

有这样一段代码:

 with dpg.texture_registry():
     width, height, _, data = dpg.load_image('image_path')
     dpg.add_static_texture(width=width, height=height, default_value=data)
     dpg.add_image(texture_tag=movie['id'])

它工作正常,但图像是根据其原始尺寸插入的。如果您尝试“为了盈利”来指定图像的大小 -

with dpg.texture_registry():
         width, height, _, data = dpg.load_image('image_path')
         dpg.add_static_texture(width=100, height=200, default_value=data)
         dpg.add_image(texture_tag=movie['id'])

喝粥(我附上截图)

在此处输入图像描述

如何调整图像大小?

python
  • 1 个回答
  • 21 Views
Martin Hope
Dark Space
Asked: 2023-04-20 15:08:40 +0000 UTC

如何通过链接查找域名?

  • 5

我正在尝试使用使用常规字符串的链接来查找域名。有些链接可以正常工作,有些则不能。

示例:
有一个链接
https://ru.stackoverflow.com/questions/ask

我需要找到一个域名:

https://ru.stackoverflow.com/

我正在使用以下正则表达式:

.*[://].*[/]{1}

但出于某种原因,代码为我找到了这一部分 -

https://ru.stackoverflow.com/questions/

尽管在使用其他链接时一切都按预期工作。
关联

https://vc.ru/new

我在常规字符串上发现了什么 -

 https://vc.ru/

问题是有些链接被正确处理,有些则没有。问题是什么?

PS 我在论坛的答案中没有找到合适的问题。只有没有 https/http 的域搜索。我需要搜索和协议

python
  • 2 个回答
  • 27 Views
Martin Hope
Dark Space
Asked: 2023-04-07 18:44:00 +0000 UTC

查找所有不带冒号的链接 Python

  • 7

我想从维基百科收集所有不包含冒号的链接。但是当使用正则表达式时,出于某种原因,一切都没有按预期工作。

html = request.urlopen('https://ru.wikipedia.org/wiki/')
soup = BeautifulSoup(html, 'lxml')

all_links = soup.find_all('a', {'href': re.compile('[^:]')})

元素之一的示例all_links

<a href="https://www.mediawiki.org/">

问题是什么?

python
  • 1 个回答
  • 25 Views
Martin Hope
Dark Space
Asked: 2023-03-29 15:22:42 +0000 UTC

为什么在重写列表时它在元组中没有改变?

  • 5

有一个元组

kort = (1, [2, 3], 4)

如何更改其中的列表?

a = [1, 2]
kort = (1, a, 4)
print(kort)

a = [5, 6]
print(kort)

执行这段代码时,元组不会改变

随之而来的是,它发生了变化。为什么会这样?

a = [1, 2]
kort = (1, a, 4)
print(kort)

a.append(5)
print(kort)
python
  • 1 个回答
  • 31 Views
Martin Hope
Dark Space
Asked: 2023-03-29 15:09:03 +0000 UTC

为什么列表元组不能成为字典中的键?

  • 8

有这段代码

ti = {
    'ke': 213, 
    31: 'zna',
    (1, 2, 3): 'kort',
}

#   {'ke': 213, 31: 'zna', (1, 2, 3): 'kort'}

他没事。钥匙适合一切,但当我尝试做时:

ti = {
    'ke': 213, 
    31: 'zna',
    (1, [1, 2], 3): 'kort',
}

我得到一个错误:

TypeError: unhashable type: 'list'

我知道键必须是可哈希的不可变类型。我可以使用元组,前提是其中的所有内容都是不可变的。并且列表无法散列。但事实上,我们无法更改元组。

为什么它的内部很重要?我无法更改其内容。

PS 奇怪之处在于列表有一个方法__hash__

print(dir(list('dewf')))


#  ...'__gt__', '__hash__', '__iadd__',...

引用文档:

如果键是一个可变对象,它的值可能会改变,因此它的散列也可能会改变。

但这就是问题的症结所在。我无法更改元组

a = [1, 2]

kort = (1, a, 4) 

print(kort) #(1, [1, 2], 4)

a = [5, 6] 

print(kort) #(1, [1, 2], 4)
python
  • 1 个回答
  • 34 Views
Martin Hope
Dark Space
Asked: 2023-03-29 14:08:32 +0000 UTC

如何从 init 获取所有属性?

  • 5

有一类Worker

class Worker:
    def __init__(self, name, age, work) -> None:
        self.name = name
        self.age = age
        self.work = work 

    def say_hello(self):
        print(f"Привет, я {self.name}")

    
oleg = Worker('Олег', 43, "Танкист")

我想获取在__init__. 到目前为止,这是唯一的解决方案

list_attr = [x for x in dir(oleg) if not x.startswith('__')]

# ['age', 'name', 'work']

也许有一些方法或更简洁的方法?

python
  • 1 个回答
  • 23 Views
Martin Hope
Dark Space
Asked: 2023-03-28 00:24:22 +0000 UTC

如何等待按钮通过 Selenium 加载

  • 5

我正在解析一个动态站点(selenium-wire,bs4)。问题是脚本需要找到按钮并单击它,以便页面进一步滚动并加载内容。

目前我尝试了不同的选择,但它们都是某种“拐杖”

这是我最新的工作版本

        try:
            while self.driver.find_element(By.CSS_SELECTOR, '.event__more--static'): 
                self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
                self.driver.find_element(By.CSS_SELECTOR, '.event__more--static').click()
                time.sleep(3)
        except: 
            print('Вы на дне!')

问题是我无法消除延迟,然后代码崩溃,因为找不到该元素(因为新的“显示更多”按钮尚未加载)。而且代码重复也很混乱。

试图通过硒方法等待页面上的元素

def takeContent(self): 
        """Забирает контент со страницы"""       
     while True: 
        try:
            self.element = WebDriverWait(self.driver, 10).until(
                EC.presence_of_element_located((By.CSS_SELECTOR, '.event__more--static'))
            )
            self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
            print(f'Я ИЩУ КНОПКУ - {self.element}')
            self.element.click()
        except: 
            print('Вы на дне!')
            break

此代码根本无法工作。第一次单击按钮后,浏览器将关闭,仅此而已。

基于添加到此代码的评论

def takeContent(self): 
        """Забирает контент со страницы"""    
        try:
            while True:
                button = WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.event__more--static')))
                print('Я нашёл кнопку - ', button)
                self.driver.execute_script("arguments[0].click();", button)
                print('Я нажал кнопку - ', button)
        except:
            print('Вы на дне!')
            self.content = self.driver.page_source

现在的问题是:

Я нашёл кнопку -  <selenium.webdriver.remote.webelement.WebElement (session="efb72689d4c57f4b5ba6f5c7ce89afb2", element="41d0f0da-e895-415c-bfad-1eddd0dad1fd")>
Я нажал кнопку -  <selenium.webdriver.remote.webelement.WebElement (session="efb72689d4c57f4b5ba6f5c7ce89afb2", element="41d0f0da-e895-415c-bfad-1eddd0dad1fd")>
Я нашёл кнопку -  <selenium.webdriver.remote.webelement.WebElement (session="efb72689d4c57f4b5ba6f5c7ce89afb2", element="41d0f0da-e895-415c-bfad-1eddd0dad1fd")>
Я нажал кнопку -  <selenium.webdriver.remote.webelement.WebElement (session="efb72689d4c57f4b5ba6f5c7ce89afb2", element="41d0f0da-e895-415c-bfad-1eddd0dad1fd")>
Я нашёл кнопку -  <selenium.webdriver.remote.webelement.WebElement (session="efb72689d4c57f4b5ba6f5c7ce89afb2", element="41d0f0da-e895-415c-bfad-1eddd0dad1fd")>

他只需单击一个按钮即可发送垃圾邮件。而且网站一直在旋转加载,无法加载任何额外的“屏幕”。是否有可能以某种方式编写代码来等待内容加载?

python
  • 2 个回答
  • 34 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5