小编Kur*_*aki的帖子

使用类或静态方法作为数据类中的default_factory

我想使用该方法填充数据类的属性default_factory。但是,由于工厂方法仅在该特定类的上下文中有意义,因此我想将其保留在类内部(例如作为静态或类方法)。例如:

from dataclasses import dataclass, field
from typing import List

@dataclass
class Deck:
    cards: List[str] = field(default_factory=self.create_cards)

    @staticmethod
    def create_cards():
        return ['King', 'Queen']
Run Code Online (Sandbox Code Playgroud)

但是,我在第 6 行收到此错误(如预期):

NameError:名称“self”未定义

我怎样才能克服这个问题?我不想将该create_cards()方法移出类。

python python-dataclasses

10
推荐指数
1
解决办法
9979
查看次数

while循环中的扫描仪输入验证

我必须在while循环中显示Scanner输入:用户必须插入输入,直到他写"退出".所以,我必须验证每个输入以检查他是否写"退出".我怎样才能做到这一点?

while (!scanner.nextLine().equals("quit")) {
    System.out.println("Insert question code:");
    String question = scanner.nextLine();
    System.out.println("Insert answer code:");
    String answer = scanner.nextLine();

    service.storeResults(question, answer); // This stores given inputs on db
}
Run Code Online (Sandbox Code Playgroud)

这不起作用.如何验证每个用户输入?

java loops while-loop java.util.scanner

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

使用Splinter登录不会设置document.cookie

我想使用Splinter登录https网页.但是,登录时似乎没有设置cookie.这是我的代码:

from splinter import Browser
import time

username = 'blabla'
password = 'blabla'

with Browser('chrome') as browser:
    browser.visit("https://the.login.page")

    browser.fill('p_username', username)
    browser.fill('p_password', password)
    browser.find_by_css('.button').first.click()

    time.sleep(2)

    browser.visit('https://other.page.after.login')
Run Code Online (Sandbox Code Playgroud)

我到了另一页,但我没有登录.

  • browser.cookies.all()不为空,它正确包含我的SESSIONID值.但...
  • document.cookie (在浏览器控制台中)为空.

难道我做错了什么?


我也试过用selenium,得到了同样的结果:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

username = 'blabla'
password = 'blabla'

browser = webdriver.Chrome()
browser.get('https://the.login.page')
time.sleep(2)

username_field = browser.find_element_by_name("p_username")
password_field = browser.find_element_by_name("p_password")
username_field.send_keys(username)
password_field.send_keys(password)

login_attempt = browser.find_element_by_xpath("//*[@type='submit']")
login_attempt.submit()
time.sleep(2)
browser.get('https://other.page.after.login')
Run Code Online (Sandbox Code Playgroud)

python cookies selenium splinter

6
推荐指数
0
解决办法
407
查看次数

在 Django 数据迁移中引用外部变量

在迁移中使用模型时,在 Django 中我们可以使用apps.get_model()来确保迁移将使用模型的正确“历史”版本(就像定义迁移时一样)。但是我们如何处理从代码库导入的“常规”变量(而不是模型)?

如果我们从另一个模块导入变量,我们将来可能会遇到问题。例如:

  1. 如果将来有一天我们删除该变量(因为我们更改了实现),这将破坏迁移。因此,我们将无法在本地重新运行迁移来从头开始重新创建数据库。
  2. 如果我们修改变量(例如,更改列表中的值),当我们在现有数据库上运行反向操作时,这将产生意想不到的效果。

所以问题是:编写迁移的最佳实践是什么?我们是否应该始终对值进行硬编码而不导入外部变量?


例子

假设我想简单地使用我在代码库中某处定义的变量来修改字段的值。例如,我想将所有普通用户变成管理员。我将用户角色存储在枚举 ( UserRoles) 中。编写迁移的一种方法是:

from django.db import migrations
from user_roles import UserRoles


def change_user_role(apps, schema_editor):
    User = apps.get_model('users', 'User')
    users = User.objects.filter(role=UserRoles.NORMAL_USER.value)
    for user in users:
        user.role = UserRoles.ADMIN.value

    User.objects.bulk_update(users, ["role"])


def revert_user_role_changes(apps, schema_editor):
    User = apps.get_model('users', 'User')
    users = User.objects.filter(role=UserRoles.ADMIN.value)
    for user in users:
        user.role = UserRoles.NORMAL_USER.value

    User.objects.bulk_update(users, ["role"])


class Migration(migrations.Migration):

    dependencies = [
        ('users', '0015_auto_20220612_0824'),
    ]

    operations = [
        migrations.RunPython(change_user_role, revert_user_role_changes)
    ]

Run Code Online (Sandbox Code Playgroud)

正如你所看到的,这将会出现我上面提到的问题。我使用了枚举示例,但这可以应用于迁移中引用的每个变量。

那么问题又来了:迁移的最佳实践是什么?我们是否应该始终对值进行硬编码而不引用可能更改的外部变量?

django django-migrations

6
推荐指数
0
解决办法
206
查看次数

PHP JsonSerializable 接口和带有嵌套对象的 jsonSerialize

我有一个ResponseGrid对象,我想用Json对其进行编码。这个对象内部有一个$row变量,它将包含一个Document对象数组。

我在和中都实现了JsonSerializable接口和jsonSerialize()方法。ResponseGridDocument

我有的是这样的:

ResponseGrid.php:

require_once ROOT_DIR . "/business/models/Document.php";

class ResponseGrid implements JsonSerializable {

    private $sEcho;
    private $iTotalRecords;
    private $iTotalDisplayRecords;
    private $rows; // This will contain an Array of Documents

    public function jsonSerialize() {
        return [
            'sEcho' => $this->sEcho,
            'iTotalRecords' => $this->iTotalRecords,
            'iTotalDisplayRecords' => $this->iTotalDisplayRecords,
            'rows' => json_encode($this->rows), //This will cause troubles
        ];
    }
}
Run Code Online (Sandbox Code Playgroud)

文件.php:

class Document implements JsonSerializable {

    private $id;
    private $name;
    private $description; …
Run Code Online (Sandbox Code Playgroud)

php arrays serialization json

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

位向量与布尔值性能列表

我试图在Python中重现我在一本书中找到的两个例子(最初是用Java编写的).

这两个函数检查字符串是否包含重复的字符.第一个函数使用integer(checker)作为位向量,而第二个函数只使用一个布尔列表.我期望使用带有位的功能有更好的性能,但实际上它表现更差.

这是为什么?从Java翻译到Python时,我写错了吗?

注意:为简单起见,我们只使用小写字母(az),尤其是位向量函数.

import sys
import timeit

def is_unique_chars_bit(my_str):
    checker = 0
    for char in my_str:
        val = ord(char) - ord('a')
        if ((checker & (1 << val)) > 0):
            return False
        checker |= (1 << val)
    return True

def is_unique_chars_list(my_str):
    if len(my_str) > 128:
        # Supposing we use ASCII, which only has 128 chars
        return False
    char_list = [False] * 128
    for char in my_str:
        val = ord(char)
        if char_list[val]:
            return False …
Run Code Online (Sandbox Code Playgroud)

python performance bit-manipulation arraylist

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

从外部模块访问argparse变量

我有4个模块:

  • entry_point.py
  • utils.py
  • runner.py
  • client.py

我使用argparsein,utils.py并且希望能够检索中的其中一个参数的值client.py

  • 入口点模块(从控制台调用的模块):

    import utils
    def main():
        console_args = utils.parse_arguments() # Get command-line arguments
        runner.run(console_args) # The main function in the program
    
    if __name__ == '__main__':
        main()
    
    Run Code Online (Sandbox Code Playgroud)
  • utils.py 模块:

    def parse_arguments():
        parser = argparse.ArgumentParser()
        parser.add_argument(
            # Several arguments, one of which should be 'url'
        )
        return parser.parse_args()
    
    Run Code Online (Sandbox Code Playgroud)
  • runner.py 模块:

    import client
    
    def run(arguments):
        user = User.new(arguments.user_id)
        client.get_user_info(user)
    
    Run Code Online (Sandbox Code Playgroud)
  • client.py 模块:

    def get_user_info(user):
        url = _compose_url('user_status')
        resp = requests.post(url, data=user.id)
    
    def _compose_url(method): …
    Run Code Online (Sandbox Code Playgroud)

python argparse

5
推荐指数
2
解决办法
435
查看次数

在 Spring 中格式化 BigDecimal

我正在使用带有 JPA 的 Spring 3。

我有这样的产品类:

@Entity
@Table(name="products")
public class Product {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;

    @Column(name="price", precision=12, scale=2)    
    private BigDecimal price;
Run Code Online (Sandbox Code Playgroud)

问题是,当我用“1.20”这样的价格填写我的产品创建表单时,我的视图中会出现“1.2”。尾随零消失。

我怎么解决这个问题?

java spring spring-mvc bigdecimal jakarta-ee

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

如何使**kwargs可选

我有两个类具有相同名称的方法,但此方法使用不同的参数.所以我考虑使用**kwargs(见下面的例子).但是这两种方法中的一种不需要任何参数,所以我得到这个错误:

TypeError:print_smt()占用1个位置参数,但给出了2个

因为我想将空字典传递给函数.

我怎么解决这个问题?我是否被迫使用if语句来调用带有和不带参数的函数,或者有更好的方法来解决问题?

class Bar(object):
  def print_smt(self, text):
    print(text)

class Foo(object):
  def print_smt(self):
    print("Nothing")

def test(obj, **p2):
  obj.print_smt(p2)


bar = Bar()
test(bar, text='print this')

foo = Foo()
test(foo) # This one breaks!
Run Code Online (Sandbox Code Playgroud)

python optional-parameters kwargs

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

在rails中发布一个数组

这个很难解释,但基本上我的控制器是构建的,并期望一个数组 params[:order_items],所以我尝试过这样:

<%= hidden_field_tag "order_items", @order[:order_items_ids] %>
Run Code Online (Sandbox Code Playgroud)

但我得到了连接的ID

<input id="gig_items" name="gig_items" type="hidden" value="2300124946">
Run Code Online (Sandbox Code Playgroud)

那么,我如何params使用html(没有js)在其中一个键中发送和数组?

ruby post ruby-on-rails

0
推荐指数
1
解决办法
1768
查看次数

使用JPA和Oracle在数据库中存储尾随零

我需要在我的数据库中存储价格.我正在使用JPA,所以我有一个这样的模型:

@Entity
@Table(name="products")
public class Product {

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private long id;

    @Column(name="price")   
    private float price;
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我用"4.20"这样的值填充价格形式输入时,在我的Oracle数据库中,我得到"4.2",失去尾随零.

我怎么解决这个问题?

编辑:因为我正在使用JPA,所以我必须避免在本机Oracle方言中编写查询.为了存储产品(以及它们的价格),我只需要编写类似的东西em.persist(product),其中em是EntityManager

oracle spring jpa scale java-ee

0
推荐指数
1
解决办法
744
查看次数