相关疑难解决方法(0)

将类添加到Django label_tag()输出

我需要一些方法来为表单字段的label_tag()方法的输出添加一个类属性.

我看到有能力传入一个attrs字典,我已经在shell中测试了它,我可以做类似的事情:

for field in form:
    print field.label_tag(attrs{'class':'Foo'})
Run Code Online (Sandbox Code Playgroud)

我会在输出中看到class ='Foo',但是我没有看到从模板中添加attrs参数的方法 - 实际上,模板是专门针对它设计的,不是吗?

我的表单定义中有一种方法来定义要在标签中显示的类吗?

在表单中,我可以执行以下操作为输入提供类

self.fields['some_field'].widget.attrs['class'] = 'Foo'
Run Code Online (Sandbox Code Playgroud)

我只需要输出它的类.

python forms django newforms

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

覆盖模块方法,其中使用from ... import

我有问题覆盖从...使用import语句的方法.举例说明问题:

# a.py module
def print_message(msg):
    print(msg)

# b.py module
from a import print_message
def execute():
    print_message("Hello")

# c.py module which will be executed
import b
b.execute()
Run Code Online (Sandbox Code Playgroud)

我想在不更改a或b模块中的代码的情况下覆盖print_message(msg)方法.我试过很多方面,但从...导入导入原始方法.当我将代码更改为

import a
a.print_message
Run Code Online (Sandbox Code Playgroud)

比我看到我的变化.

你能建议我如何解决这个问题吗?
提前感谢任何一个小例子.

最好的祝福

------------------更新------------------
我试着这样做,如下所示:

# c.py module
import b
import a
import sys
def new_print_message(msg):
    print("New content")
module = sys.modules["a"]
module.print_message = new_print_message
sys.module["a"] = module
Run Code Online (Sandbox Code Playgroud)

但这不适用于我用于... import语句的地方.仅适用于导入,但正如我所写,我不希望在b.py和a.py模块中更改代码.

python

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

覆盖实例上的特殊方法

我希望有人可以回答这个对Python有深刻理解的:)

请考虑以下代码:

>>> class A(object):
...     pass
...
>>> def __repr__(self):
...     return "A"
...
>>> from types import MethodType
>>> a = A()
>>> a
<__main__.A object at 0x00AC6990>
>>> repr(a)
'<__main__.A object at 0x00AC6990>'
>>> setattr(a, "__repr__", MethodType(__repr__, a, a.__class__))
>>> a
<__main__.A object at 0x00AC6990>
>>> repr(a)
'<__main__.A object at 0x00AC6990>'
>>>
Run Code Online (Sandbox Code Playgroud)

注意repr(a)如何不产生"A"的预期结果?我想知道为什么会这样,如果有办法实现这个目标......

我对比一下,下面的例子可行(也许是因为我们没有尝试覆盖特殊方法?):

>>> class A(object):
...     def foo(self):
...             return "foo"
...
>>> def bar(self):
...     return "bar"
...
>>> from types import …
Run Code Online (Sandbox Code Playgroud)

python metaprogramming

21
推荐指数
2
解决办法
6259
查看次数

是否可以在不更改同一类的所有其他实例的情况下更改实例的方法实现?

我不太了解python(之前从未使用过它:D),但我似乎无法在网上找到任何东西.也许我只是没有谷歌正确的问题,但在这里我去:

我想更改实例的特定方法的实现.当我用Google搜索它时,我发现你可以这样做,但它改变了同一个类的所有其他实例的实现,例如:

def showyImp(self):
    print self.y

class Foo:
    def __init__(self):
        self.x = "x = 25"
        self.y = "y = 4"

    def showx(self):
        print self.x

    def showy(self):
         print "y = woohoo"

class Bar:
    def __init__(self):
        Foo.showy = showyImp
        self.foo = Foo()

    def show(self):
        self.foo.showx()
        self.foo.showy()

if __name__ == '__main__':
    b = Bar()
    b.show()
    f = Foo()
    f.showx()
    f.showy()
Run Code Online (Sandbox Code Playgroud)

这不能按预期工作,因为输出如下:

x = 25

y = 4

x = 25

y = 4

我希望它是:

x = 25

y = 4

x = 25 …

python

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

foo.bar()和bar(foo)之间的区别?

考虑:

class Parent():
    def __init__(self, last_name, eye_color):
        self.last_name = last_name
        self.eye_color = eye_color

    def show_info(self):
        print("Last Name - "+self.last_name)
        print("Eye Color - "+self.eye_color)

billy_cyrus = Parent("Cyrus", "blue")
Run Code Online (Sandbox Code Playgroud)

以上内容来自Udacity Python课程.我发现我能够调用show_info例如billy_cyrus使用下列的:

billy_cyrus.show_info()
Parent.show_info(billy_cyrus)
Run Code Online (Sandbox Code Playgroud)

我很好奇为什么.这两种方法有区别吗?如果是这样的话什么时候会用到另一个呢?如果重要的话,我正在使用Python 3.6.

python

8
推荐指数
2
解决办法
1321
查看次数

如何在浏览器中重定向/渲染Pyodide输出?

我最近遇到了Pyodide项目

我已经使用Pyodide构建了一个小样,但是尽管我花了很多时间来查看源代码,但是对我来说,如何重定向printpython的输出(除了修改CPython源代码之外)还不是很明显(而且)。,如何将输出从matplotlib.pyplot重定向到浏览器。

从源代码来看,FigureCanvasWasm确实有一个show()带有适当后端的方法可以绘制到浏览器画布上-但是,我不清楚如何实例化此类并调用它的show()方法,或者是否还有另一种更明显的重定向方式画到画布上。

因此,我的问题是:

  1. 我如何重定向print()消息
  2. 如何强制pyodide在浏览器中绘制matplotlib图形?

这是我的测试页:

<!doctype html>
<meta charset="utf-8">
<html lang="en">
<html>
<head>
    <title>Demo</title>
    <script src="../../pyodide/build/pyodide.js"></script>
</head>
<body>
</body>
    <script type="text/javascript">
      languagePluginLoader.then(() => {
      pyodide.loadPackage(['matplotlib']).then(() => {
          pyodide.runPython(`
                  import matplotlib.pyplot as plt
                  plt.plot([1, 2, 3, 4])
                  plt.ylabel('some numbers')
                  #fig = plt.gcf()
                  #fig.savefig(imgdata, format='png')                  
                  print('Done from python!')`
          );
          //var image = pyodide.pyimport('imgdata');
          //console.log(image);
      });});

    </script>
<html>
Run Code Online (Sandbox Code Playgroud)

python matplotlib emscripten webassembly pyodide

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

如何更改实例的__cmp__函数(不在类中)?

如何更改实例的__cmp__函数(不在类中)?

例如:

class foo:
    def __init__(self, num):
        self.num = num

def cmp(self, other):
    return self.num - other.num

# Change __cmp__ function in class works
foo.__cmp__ = cmp
a = foo(1)
b = foo(1)

# returns True
a == b



# Change __cmp__ function in instance that way doesnt work
def cmp2(self, other):
    return -1

a.__cmp__ = cmp2
b.__cmp__ = cmp2

# Raise error 
a == b
#Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
#TypeError: cmp2() …
Run Code Online (Sandbox Code Playgroud)

python metaprogramming cmp

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

Django CheckboxSelectMultiple覆盖ModelForm中的"选项"

我希望能够以我的django形式提取不同的信息:

这是我的形式:

<form action="" method="post">{% csrf_token %}
{{ form.as_p }}
<input type="submit" value="Submit" />
</form>

class InstanceForm(ModelForm):
    class Meta:
        model = models.BaseAsset
        widgets = {
            'labels': LabelIconCheckboxSelectMultiple()
        }
Run Code Online (Sandbox Code Playgroud)

该模型:

class AssetClass(models.Model):
    default_labels = models.ManyToManyField(Label, null=True, blank=True)
    pass
Run Code Online (Sandbox Code Playgroud)

M2M参考字段

class Label(models.Model):
    explanation = models.CharField(null=True, max_length=63)
    svgpreview  = models.CharField(null=True, max_length=31)
    def __unicode__(self):
        return unicode(self.explanation)
    pass
Run Code Online (Sandbox Code Playgroud)

现在,生成的HTML代码{{ form.as_p }}如下:

<li><label for="id_labels_0"><input type="checkbox" name="labels" value="1" id="id_labels_0" /> Consult owner before using</label></li>
<li><label for="id_labels_1"><input type="checkbox" name="labels" value="2" id="id_labels_1" /> This item is broken</label></li> …
Run Code Online (Sandbox Code Playgroud)

django django-forms

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

具有 __slots __ 的类实例的 Monkeypatch 方法

我一直在尝试解决第三方模块中的错误。该错误最近已修复,但我一直想知道我的问题。也许这个问题将来会对我或其他人有所帮助。

该模块定义了一个类 Runtime,其中包含我使用的几种方法。导入模块后,它会自动创建一个运行时实例,加载配置并将该实例提供给用户(我)使用。

# thirdPartyModule.py

class Runtime:
    def __init__(self, a):
        self.a = a

    def configuration(self, ...):
        ...

    def fun(self):
        print(self.a)

rt = Runtime("twice")
rt.configuration(...)
Run Code Online (Sandbox Code Playgroud)

不幸的是,其中一个运行时方法包含一个错误。我曾经通过用一个工作替代品覆盖实例的方法来修补这个错误,如下所示

# mycode.py

import types
from thirdPartyModule import rt

def newfun(self):
    print(self.a, self.a)

rt.fun = types.MethodType(newfun, rt)
rt.fun()
Run Code Online (Sandbox Code Playgroud)

当我等待开发人员修复错误时,这一切都很好。__slots__或者至少在开发人员添加到类中之前它是这样的:

# thirdPartyModule.py

class Runtime:
    __slots__ = ("a", )

    def __init__(self, a):
        self.a = a

    ...
Run Code Online (Sandbox Code Playgroud)

从那时起,我在这个论坛上尝试了几种方法覆盖解决方案,但都被拒绝了(“AttributeError:'Runtime'对象属性'fun'是只读的”)。

这可能unittest.mock 可以帮助我,但我对嘲笑不太熟悉。我尝试了以下方法但没有成功:

import unittest.mock

rt.fun = mock.Mock(rt.fun, side_effect=newfun)
Run Code Online (Sandbox Code Playgroud)

这会导致相同的 AttributeError。也许我可以模拟整个实例 ( rt = mock.Mock(rt)) …

python methods monkeypatching slots

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