小编Com*_*fox的帖子

返回带有返回类型声明的NULL

当我遇到问题时,我正在重构一个用于PHP7的代码库,特别是实现标量类型提示和返回类型提示.

我有一个属性的类,其中一个属性.此id不是必需的(您可以在不设置ID的情况下构造对象).在创建此类的新对象时,不要设置id,并且只要将其插入db(通过单独的映射器类),它就会获得id.

此映射器类需要检查对象是否已存在于db中,并通过检查是否已设置id来执行此操作:

if(empty($exampleObject->getId())) {
    // Insert object
} else {
    // Update object
}
Run Code Online (Sandbox Code Playgroud)

我将返回类型提示应用于我的代码库中的每个函数,问题是如果我强制执行int返回类型,函数getId()不能返回NULL.It TypeErrors,即使没有启用严格的输入:

致命错误:未捕获TypeError:ExampleClass :: getId()的返回值必须是integer类型,返回null

我认为没有为此getter设置返回类型提示,但我意识到问题可能不是返回类型提示,而是我使用混合返回类型的事实.我记得在某处读过使用混合返回类型是一件坏事,但我不知道如何在不使用混合返回类型的情况下解决这个问题.我可以:

  • 在getter中抛出异常,并在mapper类中设计检查,以便捕获该异常.
  • 捕获TypeError异常,并使用它来指示未设置id.
  • 将id属性设为public,因此我可以直接调用isset.
  • 添加不同的方法 hasId() return isset($this->id)

坦率地说,不喜欢任何这些解决方案,我想知道是否有更好的选择.对于这样的案例,最佳做法是什么?

另外,如果我启用了严格的输入,我不应该只获得TypeError吗?我认为PHP7默认为"弱类型提示".

php type-hinting php-7 php-7.1

16
推荐指数
1
解决办法
6607
查看次数

将列表存储为逗号分隔字符串的 Django 字段

我正在寻找一种将 Python 列表作为逗号分隔字符串存储在数据库中的解决方案。在做了一些研究并得出结论认为 Django 没有像这样开箱即用的东西后,我决定自己写这个。

这是我想出的模型字段:

class CommaSeparatedStringsField(models.CharField):
    def from_db_value(self, value, *args):
        if not value:
            return []

        return value.split(',')

    def to_python(self, value):
        if isinstance(value, list):
            return value

        return self.from_db_value(value)

    def get_prep_value(self, value):
        return ','.join(value)

    def value_to_string(self, obj):
        return self.get_prep_value(self.value_from_object(obj))

    def formfield(self, **kwargs):
        defaults = {'form_class': ListField}
        defaults.update(kwargs)

        return models.Field.formfield(self, **defaults)
Run Code Online (Sandbox Code Playgroud)

非常简单的东西,到目前为止,没有问题。

与此模型字段关联的表单字段和小部件应该是一个多选框。列表中的每个元素都是选择字段中的一个选项。

如果您想知道我为什么要这样,它是用于Bootstrap Tags Input 的,这是一个用于输入“标签”(多个值)的输入小部件。这可以使用文本框工作,但我更愿意在 Python 中将此字段表示为列表。

现在有了 MultipleChoiceField(它使用 MultipleSelect 小部件),但它有一个预定义的选项列表。这不是我想要的,在我的情况下,选项数据,我不关心选定的选项。

所以我写了一个自定义表单字段和小部件,它继承了上述类:

class ListWidget(SelectMultiple):
    def render_options(self, options):
        output = []

        for option_value, option_label in options: …
Run Code Online (Sandbox Code Playgroud)

python django

8
推荐指数
0
解决办法
6348
查看次数

循环遍历枚举的好方法是什么?

背景

对于嵌入式项目中的 UI,我正在寻找一种很好的通用方式来存储“状态”并通过按下按钮(例如菜单项列表)循环浏览它。

通常,我喜欢为此目的使用枚举,例如:

enum class MenuItem {
    main,
    config,
    foo,
    bar,
};
Run Code Online (Sandbox Code Playgroud)

然后,在我的 UI 代码中,我可以存储一个currentMenuItem状态,如

MenuItem currentMenuItem = MenuItem::MAIN;
Run Code Online (Sandbox Code Playgroud)

并通过与currentMenuItem枚举中声明的任何可能值进行比较来根据当前状态执行操作。

问题

问题是,我现在想进入下一个菜单项。为此,我可以非常轻松地编写一个函数,通过强制转换为 int,递增 1,然后将其转换回枚举来执行此操作。我有多个不同的枚举,所以我什至可以使用这个模板化函数来为任意枚举执行此操作:

template <typename T>
void advanceEnum(T &e) {
    e = static_cast<T>(static_cast<int>(e) + 1);
}
Run Code Online (Sandbox Code Playgroud)

这样做的问题是它不会环绕:它会很高兴地继续增加底层整数,使其超出实际枚举中的元素数量。我可以很容易地解决这个问题(通过对上述函数中的元素数取模),只要有一种干净的方法来获取枚举的元素数。其中,据我所知,真的没有。

自定义枚举?

我正在考虑编写一个实现此行为的自定义“CyclicEnum”类,我随后可以从中派生。这样,我也可以把它写成一个重载的operator++.

但是,我仍然没有设计出如何在不实际使用枚举的情况下获得类似枚举的东西。例如,我得到了这样的东西:

class CyclicEnum {
public:
    uint8_t v;

    CyclicEnum& operator++() {
        v = (v+1) % count;
        return *this;
    }

    CyclicEnum operator++(int) {
        CyclicEnum old = *this;
        operator++();
        return old;
    }
private:
    uint8_t count;

protected: …
Run Code Online (Sandbox Code Playgroud)

c++ embedded

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

如何在不使用绝对定位的情况下将div定位到容器的底部?

我有一个非常困难的CSS问题.我有以下布局(这只是Paint中的快速模型):

http://i.imgur.com/SwxCYbJ.png

我需要将红色框浮动到它的容器底部.通常我会使用position: absolute; bottom: 0;但会导致文本与div重叠,这是我不想要的.我希望盒子的行为与第二张图片相同(相同的情况,但文字更多)

这甚至可能吗?我不介意倾销对非常旧的浏览器的支持.

html css css-position

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

在PHP OOP中处理数据库访问的正确方法

我需要一些PHP的数据库访问帮助.我正试图以OOP的方式做事,但我不确定我是否正朝着正确的方向前进.

假设我有一个Person类,例如:

class Person {
    private $id;
    private $firstname;
    private $lastname;
    // maybe some more member variables

    function __construct($id = NULL) {
        if(isset($id)) {
            $this->id = $id;
            $this->retrieve();
        }
    }

    // getters, setters and other member functions

    private function retrieve() {
        global $db;

        // Retrieve user from database
        $stmt = $db->prepare("SELECT firstname, lastname FROM users WHERE id = :id");
        $stmt->bindParam(":id", $this->id, PDO::PARAM_INT);
        $stmt->execute();
        $result = $stmt->fetch();

        $this->firstname = $result['firstname'];
        $this->lastname = $result['lastname'];
    }

    function insert() {
        global $db;

        // Insert …
Run Code Online (Sandbox Code Playgroud)

php database oop orm pdo

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

标签 统计

php ×2

c++ ×1

css ×1

css-position ×1

database ×1

django ×1

embedded ×1

html ×1

oop ×1

orm ×1

pdo ×1

php-7 ×1

php-7.1 ×1

python ×1

type-hinting ×1