相关疑难解决方法(0)

在Flask视图函数之间共享数据

我正在使用Flask构建一个非常小的单页动态网站.我想在不使用类的情况下跨函数共享变量及其值的列表.

我查看了Flask的View类,但是我觉得我的应用程序不够大,也不够复杂,无法使用Flask实现我的项目的基于类的版本.如果我正确说明我也将失去使用route装饰器的能力,并且必须使用其代理功能add_url_rule.

这也会迫使我将我的代码重构为这样的东西:

from flask.views import View
class ShowUsers(View):

def dispatch_request(self):
    users = User.query.all()
    return render_template('users.html', objects=users)

app.add_url_rule('/users/', view_func=ShowUsers.as_view('show_users'))
Run Code Online (Sandbox Code Playgroud)

对于变量共享,我想到了两种技术.

  1. x = ""
    
    def foo():
        global x
        x = request.form["fizz"]
    
    def bar():
        # do something with x (readable)
        print(x)
    
    def baz():
        return someMadeupFunction(x)
    
    Run Code Online (Sandbox Code Playgroud)
  2. def foo():
        x = request.form["fizz"]
        qux(someValue)
    
    def qux(i):
        menu = {
        key0: bar,
        key1: baz,
        }
        menu[i](x)
    
    def bar(x):
        # do something with x (readable)
        print(x)
    
    def baz(x):
        return someMadeupFunction(x)
    
    Run Code Online (Sandbox Code Playgroud)

python flask

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

使用django生成运行时模型

我有一个需要在运行时生成模型的应用程序.
这将根据当前的数据库方案完成.
怎么做到呢?
如何在python中在运行时创建类?
我应该创建一个json表示并将其保存在数据库中,然后将其反序列化为python对象吗?

python django django-models

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

在python中使用eval动态创建类

我想接受一个参数并创建一个名称为参数本身的类。例如,我以“Int”为参数,创建了一个名为“Int”的类,我的类就是这样的。

class Int :
    def __init__(self,param) :
        self.value = 3
Run Code Online (Sandbox Code Playgroud)

我就是这样做的。

def makeClass( x ) :

    return eval( 'class %s :\n    def __init__(self,param) :\n        self.type = 3'%(x,))
Run Code Online (Sandbox Code Playgroud)

然后打电话

myClass = makeClass('Int')
myInt = myClass(3)
Run Code Online (Sandbox Code Playgroud)

我收到了一个语法错误。请帮忙。

python oop metaprogramming

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

如何动态地向接口添加属性

我需要为接口中的每个属性添加一个属性.所以我试图动态修改它来添加它们,但现在还没有取得多大成功.

假设我有以下界面:

class IMember(Interface):
    first_name = schema.TextLine(title=u'first name')
    last_name = schema.TextLine(title=u'last name')
Run Code Online (Sandbox Code Playgroud)

我想像这样修改它:

class IMember(Interface):
    first_name = schema.TextLine(title=u'first name')
    last_name = schema.TextLine(title=u'last name')
    visbility_first_name = schema.Bool(title=u'Display: first name')
    visbility_last_name = schema.Bool(title=u'Display: last name')
Run Code Online (Sandbox Code Playgroud)

我之后尝试修改了类,但由于它已经初始化,因此设置了架构,我不知道如何更改它.我还想过编写一个指令(例如:interface.Implements())但是添加属性似乎很复杂.

我的最终目标是添加一个带有一组Bool小部件的z3c.form字段集.

那么,有没有办法在Python中完成它,或者我是否必须修改界面并手动添加所有属性?

谢谢 !

python plone zope.interface

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

各种用途有用吗?

在Haskell中,种类(类型)允许一些有用的东西,比如类型构造函数.我的问题是,对于各种类型(类型的类型)是否会有任何好处,或者他们可以做什么,只有种类和类型不能轻易完成?

haskell types functional-programming

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

使用`type`动态创建Django模型

我有20个+ MySQL表,prm_a,prm_b,...有相同的基本结构,但不同的名字,我想不用写每一个用手工将它们与Django的模型类相关联.所以,感到雄心勃勃,我以为我会尝试使用type()作为一个班级工厂:

以下作品:

def get_model_meta_class(prm_name):
    class Meta:
        app_label = 'myapp'
    setattr(Meta, 'db_table', 'prm_%s' % prm_name)
    return Meta

prm_class_attrs = {
    'foo': models.ForeignKey(Foo),
    'val': models.FloatField(),
    'err': models.FloatField(blank=True, null=True),
    'source': models.ForeignKey(Source),
    '__module__': __name__,
}

###
prm_a_attrs = prm_class_attrs.copy()
prm_a_attrs['Meta'] = get_model_meta_class('a')
Prm_a = type('Prm_a', (models.Model,), prm_a_attrs)

prm_b_attrs = prm_class_attrs.copy()
prm_b_attrs['Meta'] = get_model_meta_class('b')
Prm_b = type('Prm_b', (models.Model,), prm_b_attrs)
###
Run Code Online (Sandbox Code Playgroud)

但是如果我尝试生成模型类如下:

###
prms = ['a', 'b']
for prm_name in prms:
    prm_class_name = 'Prm_%s' % prm_name
    prm_class = type(prm_class_name, …
Run Code Online (Sandbox Code Playgroud)

python django metaclass python-2.7

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

Python ABC多重继承

我认为代码比用文字可以更好地解释问题。这是my_abc.py中的代码:

from abc import ABCMeta, abstractmethod

class MyABC(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def print(self):
        pass
Run Code Online (Sandbox Code Playgroud)

这是my_class.py中的代码

from my_abc import MyABC
from third_party_package import SomeClass

class MyClass(MyABC, SomeClass):
    def __init__(self):
        super(MyClass, self).__init__()

    def print(self):
        print('Hello ABC')
Run Code Online (Sandbox Code Playgroud)

当我尝试运行my_class.py时,我得到:

TypeError:调用元类基础元类冲突时出错:派生类的元类必须是其所有基础元类的(非严格)子类

我知道我可以创建一个直接从我的接口MyABC继承的类,然后创建另一个类,然后再从我创建的该类和第三方模块类继承。

我的问题是:是否有另一种更好,更适当的方法直接执行此操作,而无需为我的目的创建中间类?

python metaclass multiple-inheritance python-2.7 urwid

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

python动态设置非实例类属性

我正在尝试动态添加类属性,但不是在实例级别。例如我可以手动执行以下操作:

class Foo(object):
    a = 1
    b = 2
    c = 3
Run Code Online (Sandbox Code Playgroud)

我希望能够做到:

class Foo(object):
    dct = {'a' : 1, 'b' : 2, 'c' : 3}
    for key, val in dct.items():
        <update the Foo namespace here>
Run Code Online (Sandbox Code Playgroud)

我希望能够做到这一点,而无需从类外部调用该类(因此它是可移植的),或者不需要额外的类/装饰器。这可能吗?

python attributes metaprogramming

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

在python中使用类型类创建一个类型类

我正在阅读关于元类的这篇有趣的帖子什么是Python中的元类?.接受的答案显示了如何使用具有以下签名的类型创建类.

type(类的名称,父类的元组(用于继承,可以为空),包含属性名称和值的字典)

我尝试使用上面的签名创建"类型"类,我很惊讶我被允许创建一个首先!您的意见表示赞赏!

type = type('type',(),{});

其次,在使用上述语法创建类型类之后,我无法做到

myclass = type('myclass',(),{}); 
Run Code Online (Sandbox Code Playgroud)

type = type('type',(),{});

我说错了

Traceback(最近一次调用last):TypeError中的文件"",第1行:object.new()不带参数

但是,当我尝试以下内容时,我可以成功.

class myclass(object):
    pass
Run Code Online (Sandbox Code Playgroud)

我很困惑,根据我的理解,上面的代码片段应该调用类型来尝试创建类'myclass'.发生什么了!?我错过了一些细节吗?

python metaclass

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

在 Python 中子类化时附加到成员列表

说我有这门课:

class FooClass(object):
    foos = ["foo", "bar"]

    def do_foos(self):
        for foo in self.foos:
            print("I have a " + foo)

    # ...
Run Code Online (Sandbox Code Playgroud)

我想为这个扩展的类创建一个 SpecialisedFooClass FooClass,将一个项目添加"spec"foos(即foos包含["foo", "bar", "spec"])。

SpecialisedFooClass.foos应该取决于FooClass.foos:如果我更改FooClass'定义以便foos包含["foo", "bam", "bat"],则SpecialisedFooClass.foos应该包含["foo", "bam", "bat", "spec"]


这是迄今为止我想出的最好的方法:

class SpecialisedFooClass(FooClass):
    foos = FooClass.foos + ["spec"]
Run Code Online (Sandbox Code Playgroud)

但我发现明确提到了FooClass有关。当我决定添加一个中间子类时(即当SpecialisedFooClass' 超类更改时),我将不可避免地忘记更新此引用。事实上,我已经在 IRL 使用我正在处理的代码库中犯了这个错误(实际上并没有处理 foos、bams 和 bats...)。


在我的情况下实际上没有特殊要求foos是类成员而不是实例成员,所以这也可以,但我觉得它很难看。此外,该super调用仍然有一个显式的类引用 …

python oop inheritance

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