小编Par*_*der的帖子

PHP中静态成员的继承

在PHP中,如果在父类中定义了静态属性,则不能在子类中重写它.但我想知道是否有任何解决方法.

我正在尝试为其他人(有点笨重)的函数编写一个包装器.有问题的函数可以应用于许多不同的数据类型,但每个都需要不同的标志和选项.但99%的时间,每种类型的默认值就足够了.

如果可以通过继承完成,而不必每次都编写新函数,那将是很好的.例如:

class Foo {
    public static $default = 'DEFAULT';

    public static function doSomething ($param = FALSE ) {
        $param = ($param === FALSE) ? self::$default : $param;
        return $param;
    }
}

class Bar extends Foo {
    public static $default = 'NEW DEFAULT FOR CHILD CLASS';
}

echo Foo::doSomething() . "\n"; 
// echoes 'DEFAULT'

echo Bar::doSomething() . "\n"; 
// echoes 'DEFAULT' not 'NEW DEFAULT FOR CHILD CLASS' 
// because it references $default in the parent class :(
Run Code Online (Sandbox Code Playgroud)

php inheritance

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

使用Flask-SQLAlchemy在Alembic自动生成迁移时未检测到任何更改

我无法让Alembic使用db.Model(Flask-SQLAlchemy)而不是使用(Flask-SQLAlchemy)自动生成从更改到类的候选迁移Base.

我已修改env.py为创建我的Flask应用程序,导入所有相关模型,初始化数据库,然后运行迁移:

...
uri = 'mysql://user:password@host/dbname?charset=utf8'
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = uri
app.config['SQLALCHEMY_ECHO'] = True
db.init_app(app)
with app.test_request_context():
    target_metadata = db.Model.metadata
    config.set_main_option('sqlalchemy.url', uri)
    if context.is_offline_mode():
        run_migrations_offline()
    else:
        run_migrations_online()
...
Run Code Online (Sandbox Code Playgroud)

这种方法工作正常drop_all(),create_all()(例如,重新创建单元测试的测试分贝时),但似乎在这种情况下落空.自动生成的版本脚本始终具有空的升级和降级方法,例如,

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    pass
    ### end Alembic commands ###


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    pass
    ### end Alembic commands ###
Run Code Online (Sandbox Code Playgroud)

我的更改包括重命名列,更改列定义等 …

sqlalchemy database-migration flask flask-sqlalchemy alembic

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

编码标准和行长度

我见过的每个编码标准都对一行中的字符数有建议或绝对限制.在这个限制范围内有各种各样的工作方式,但我没有看到这方面的任何具体指导.

显然,如果可能的话,不要写过长的行.

但是,如果这不实用呢?如何处理长线?

这里有几个例子

if ($Stmt = $Mysqli->prepare("SELECT color, pattern, size,
                              manufacturer, mfgSku, storeLocation,
                              aisle, status
                              FROM tblItems WHERE ourSku = ?")) {
Run Code Online (Sandbox Code Playgroud)

要么

$flavors = array ('chocolate', 'strawberry', 'vanilla', 'cookie dough', 
                  'chocolate chip', 'mint chocolate chip', 'rocky road',
                  'peach', 'fudge brownie', 'coffee', 'mocha chip');
Run Code Online (Sandbox Code Playgroud)

要么

$Stmt->bind_result( $this->_firstName,
                    $this->_lastName,
                    $this->_BillToAddress->address1,
                    $this->_BillToAddress->address2,
                    $this->_BillToAddress->city,
                    $this->_BillToAddress->state,
                    $this->_BillToAddress->zip,
                    $this->_BillToAddress->country,
                    $this->_email,
                    $this->_status,
                    $this->_primaryPhone,
                    $this->_mobilePhone );
Run Code Online (Sandbox Code Playgroud)

在每个示例中,冗长代码的缩进是不同的.这样做有更好或更"标准"的方式吗?额外的行总是应该以相同的方式缩进.或者这样可以吗?

php coding-style

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

什么事情最好不要在构造函数中完成?

我首先提出了一个问题:"在构造函数上执行单元测试的最佳方法是什么(例如,PHP5中的__construct())",但在阅读相关问题时,我看到几条评论似乎表明设置成员变量或在构造函数中执行任何复杂的操作都是no-nos.

这里讨论的类的构造函数接受一个参数,对它执行一些操作(确保它通过嗅探测试,并在必要时进行转换),然后将其存储在成员变量中.

我认为这样做的好处是:

1)每当实例化该类的对象时,客户端代码将始终确定具有该成员变量的值,并且

2)它在客户端代码中保存了一个步骤(其中一个可能被遗漏),例如,

$Thing = new Thing;
$Thing->initialize($var);
Run Code Online (Sandbox Code Playgroud)

什么时候我们可以做到这一点

$Thing = new Thing($var);
Run Code Online (Sandbox Code Playgroud)

并完成它.

这是不是吗?如果是这样的话?

php oop constructor

7
推荐指数
3
解决办法
807
查看次数

MySQL插入:先测试?

例如,在将记录插入具有唯一索引的表中时,最好先测试吗?例如,

$mysqli->query('SELECT email FROM tblUser WHERE email = 'foo@bar.org');
Run Code Online (Sandbox Code Playgroud)

然后确保返回0行,然后插入?

$mysqli->query('INSERT INTO tblUser ...');
Run Code Online (Sandbox Code Playgroud)

或者,如果有重复的条目,最好是跳过测试并处理错误?

谢谢!

php mysql database

6
推荐指数
2
解决办法
4208
查看次数

Doctrine 2.1 @Column注释中"options"的语法是什么?

我正在尝试在Doctrine 2.1中定义一个列(使用注释),该列映射到MySQL中的固定长度CHAR列.使用fixed = true不能完成这项工作.注释

* @ORM\Column(type="string", length=49, fixed=true, nullable=false)
Run Code Online (Sandbox Code Playgroud)

它会导致错误:"在属性[name here]上声明的注释@ORM\Column没有名为"fixed"的属性.可用属性:name,type,length,precision,scale,unique,nullable,options,columnDefinition ".所以我假设"固定"位需要在"选项"中传递.但是怎么样?我已经搜索了Doctrine 2.1文档,但却找不到任何相关内容.

我试过了

* @ORM\Column(type="string", length=49, options="fixed=true", nullable=false)
Run Code Online (Sandbox Code Playgroud)

这不会导致错误,但会被忽略 - 创建的列是VARCHAR(49).

我不想使用columnDefinition.

有什么建议?

谢谢

doctrine doctrine-orm

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

如何从 Flask 中的辅助函数重定向?

在许多表单上,我们都有一个取消按钮。为了让事情保持干燥,似乎有一个辅助功能是有序的。函数 if_form_cancel() 将检查取消按钮是否已被单击,然后相应地重定向(将目标传递给函数)。但是,当我们使用辅助函数时,重定向会被忽略(它可以很好地在线工作)。

查看.py

from helper.py import if_form_cancel
...

def index():
    return render_template('index.html')

def edit():
    ...
    form = EditForm(obj=user, csrf_enabled=False)
    if request.method == 'POST':
        if_form_cancel(url_for('.index')) 
        if form.validate():
            ...
            return redirect(url_for('.index'))
        return render_template('edit.html')
Run Code Online (Sandbox Code Playgroud)

助手文件

from flask import request, redirect, flash

def if_form_cancel(destination='/'):
    try:
        if request.form['cancel']:
            flash(u'Operation canceled at user request')
            return redirect(destination)
    except KeyError:
        pass
Run Code Online (Sandbox Code Playgroud)

编辑.html

....
<input type="submit" name="submit" value="Submit" />
<input type="submit" name="cancel" value="Cancel" />
....
Run Code Online (Sandbox Code Playgroud)

单击取消按钮时的结果:调用辅助函数,闪烁正确的消息,但不会发生重定向。是否可以从这样的辅助函数重定向?如果是这样怎么办?我们做错了什么?

python flask

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

我如何告诉 mkvirtualenv 我想使用哪个版本的 Python?

我对使用时安装的 Python 版本感到困惑mkvirtualenv。在任何 virtualenv 之外,这就是我所拥有的。

$ which python 
/opt/local/bin/python    << MacPorts installed Python
$ python -V
Python 2.7.13
$ python -c "import ssl; print ssl.OPENSSL_VERSION"
OpenSSL 1.0.2k  26 Jan 2017
Run Code Online (Sandbox Code Playgroud)

到目前为止还好。

现在,创建虚拟环境...

$ mkvirtualenv foo
[normal stuff here]
(foo) $ which python
/Users/me/Workspace/venvs/foo/bin/python
(foo)$ python -V
Python 2.7.10
Run Code Online (Sandbox Code Playgroud)

为什么这个 python 是 2.7.10?而不是 python 2.7.13?

$ python -c "import ssl; print ssl.OPENSSL_VERSION"
OpenSSL 0.9.8zh 14 Jan 2016
Run Code Online (Sandbox Code Playgroud)

这是从哪里来的?

我如何知道mkvirtualenv我想使用哪个版本的 Python?

virtualenv virtualenvwrapper python-2.7

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

像PHP中的重载一样?

我想完成这样的事情:调用一个方法,说"转",然后对不同的数据类型进行不同的"转向",例如,用"螺丝刀"对象调用"turn"/ param使用"turnScrewdriver" "方法,用"steeringWheel"对象/ param调用"turn"使用"turnSteeringWheel"方法等等 - 正在做不同的事情,但它们都被称为"转向".

我想实现这一点,以便调用代码不必担心涉及的类型.在这个例子中,"转弯"应该足以"转动""螺丝刀","steeringWheel"或任何可能需要"转动"的东西.

在C++中,我会通过重载执行此操作 - 并且C++会根据数据类型/签名对事物进行排序 - 但这在PHP中不起作用.

有关我应该从哪里开始的任何建议?switch语句很明显,但我认为必须有一个(更优雅的)OO解决方案.没有?

TIA

php oop overloading

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

如何将排列应用于列表?

如何让 Sympy Permutation 在列表上起作用?例如,

from sympy.combinatorics import Permutation

lst = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
perm = Permutation([[0, 2, 8, 6], [1, 5, 7, 3]])
# Then something like...
perm * lst   # This doesn't work. Throws AttributeError because of list
Run Code Online (Sandbox Code Playgroud)

我想要这样的返回(在这个例子中):

['g', 'd', 'a', 'h', 'e', 'b', 'i', 'f', 'c']
Run Code Online (Sandbox Code Playgroud)

我已经阅读了https://docs.sympy.org/latest/modules/combinatorics/permutations.html,但不知道如何。

关于如何解决这个问题的任何建议?

python list permutation sympy python-3.x

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