小编Ivo*_*ijk的帖子

在python单元测试中模拟类属性的更好方法

我有一个基类,它定义了一个类属性和一些依赖它的子类,例如

class Base(object):
    assignment = dict(a=1, b=2, c=3)
Run Code Online (Sandbox Code Playgroud)

我想用不同的任务对这个类进行单元测试,例如空字典,单项等.当然,这非常简化,不是重构我的类或测试的问题.

我得到的(pytest)测试,最终,工作是

from .base import Base

def test_empty(self):
    with mock.patch("base.Base.assignment") as a:
        a.__get__ = mock.Mock(return_value={})
        assert len(Base().assignment.values()) == 0

def test_single(self):
    with mock.patch("base.Base.assignment") as a:
        a.__get__ = mock.Mock(return_value={'a':1})
        assert len(Base().assignment.values()) == 1
Run Code Online (Sandbox Code Playgroud)

这感觉相当复杂和hacky - 我甚至不完全理解为什么它工作(虽然我熟悉描述符).mock会自动将类属性转换为描述符吗?

一种感觉更符合逻辑的解决方案不起作用:

def test_single(self):
    with mock.patch("base.Base") as a:
        a.assignment = mock.PropertyMock(return_value={'a':1})
        assert len(Base().assignment.values()) == 1
Run Code Online (Sandbox Code Playgroud)

要不就

def test_single(self):
    with mock.patch("base.Base") as a:
        a.assignment = {'a':1}
        assert len(Base().assignment.values()) == 1
Run Code Online (Sandbox Code Playgroud)

我尝试过的其他变种也不起作用(测试中的作业保持不变).

模拟类属性的正确方法是什么?有没有比上面更好/更容易理解的方式?

python unit-testing mocking python-mock

22
推荐指数
5
解决办法
3万
查看次数

混合全局/参数和名为'top'的函数的奇怪python行为

以下代码(不是直接在解释器中,而是作为文件执行)

def top(deck):
    pass

def b():
    global deck
Run Code Online (Sandbox Code Playgroud)

产生错误

SyntaxError: name 'deck' is local and global
Run Code Online (Sandbox Code Playgroud)

在python2.6.4和

SyntaxError: name 'deck' is parameter and global
Run Code Online (Sandbox Code Playgroud)

在python 3.1上

python2.4似乎接受这个代码,2.6.4交互式解释器也是如此.

这已经很奇怪了; 如果它是一个方法中的全局和另一个方法中的参数,为什么'deck'会发生冲突?

但它更奇怪了.将'top'重命名为其他任何东西,问题就会消失.

有人可以解释这种行为吗?我觉得我错过了一些非常明显的东西.名称"顶部"是否会以某种方式影响某些范围内部?

更新

这确实似乎是python核心中的一个错误.我已经提交了一份错误报告.

python python-3.x

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

使用io.StringIO模拟文件时出现Unicode问题

我正在使用一个io.StringIO对象来模拟一个类的单元测试中的文件.问题是这个类似乎希望默认情况下所有字符串都是unicode,但内置str函数不会返回unicode字符串:

>>> buffer = io.StringIO()
>>> buffer.write(str((1, 2)))
TypeError: can't write str to text stream
Run Code Online (Sandbox Code Playgroud)

>>> buffer.write(str((1, 2)) + u"")
6
Run Code Online (Sandbox Code Playgroud)

作品.我假设这是因为与unicode字符串的串联也会使结果成为unicode.这个问题有更优雅的解决方案吗?

python unicode stringio

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

android如何处理预览大小/比率与实际SufaceView大小之间的差异?

我正在编写一个小型Android应用程序,用户可以在相机的实时预览中放置图像并拍摄照片.然后,应用程序将适当地合并这两个图像 - 所有这一切都正常.

我知道你可以使用Camera.getParameters()来获取/设置PreviewSize,我认为这与实时"相机提要"的大小有关.

但是,显示相机预览的SurfaceView的大小与报告(和使用的)PreviewSizes的大小不同.例如,在模拟器中,我可用的SurfaceView恰好是360x215,而PreviewSize是320x240.尽管如此,整个SurfaceView仍然充满了预览.

但最终产生的图片(也是?)320x240.android如何弥补尺寸和宽高比的这些差异?图像被截断了吗?

或者我只是误解了PreviewSize的含义 - 这与生成的图片的大小有关,还是与SurfaceView上投影的"实时预览"有关?是否有任何非平凡的相机示例可以解决这个问题?

我需要知道转换是如何发生的,最终将图像正确地复制/缩放到照片中,因此这些问题.

camera android image preview surfaceview

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

咕噜失败,"找不到模块'tmp'"

我正在接管一个现有的项目.它包含package.json和Gruntfile.根据这里的说明,我跑了

npm install
Run Code Online (Sandbox Code Playgroud)

在全球安装grunt-cli之后.

但是,运行grunt导致

$ grunt --env=production
Loading "compass.js" tasks...ERROR
>> Error: Cannot find module 'tmp'
Warning: Task "compass" not found. Use --force to continue.

Aborted due to warnings.
Run Code Online (Sandbox Code Playgroud)

使用-v运行会产生回溯:

Loading "compass.js" tasks...ERROR
>> Error: Cannot find module 'tmp'
>>     at Function.Module._resolveFilename (module.js:338:15)
>>     at Function.Module._load (module.js:280:25)
>>     at Module.require (module.js:364:17)
>>     at require (module.js:380:17)
>>     at Object.exports.init (/..(path)../node_modules/grunt-contrib-compass/tasks/lib/compass.js:4:13)
>>     at Object.module.exports (/..(path)../node_modules/grunt-contrib-compass/tasks/compass.js:12:42)
>>     at loadTask (/..(path)../node_modules/grunt/lib/grunt/task.js:325:10)
>>     at /..(path)../node_modules/grunt/lib/grunt/task.js:361:7
>>     at Array.forEach (native)
>> …
Run Code Online (Sandbox Code Playgroud)

npm gruntjs

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

带有复杂标题的Android ListView

我正在尝试向ListView(以及稍微复杂的页脚)添加一个复杂/非平凡的标题,需要与其他内容一起滚动.

标题包括

  • 带有粗体文本,黑色透明背景和圆角的TextView
  • 带有普通文本的TextView,黑色透明背景
  • 一个ImageView
  • 一个可点击的按钮(实际上是带有onClick的ImageView)和一个分隔符

我对addHeaderView很熟悉,但是如果我尝试添加一个复杂的视图(由一个包含多个子节点的LinearLayout组成),我只会在listview中看到复杂标题的第一个子节点作为标题.

此外,设计中断(因为标题可能是透明的样式,ListView本身不是.也许这可以通过向ListView本身及其条目(不应该是透明的)添加更多样式来解决,但我有印象我只是在这里达到ListViews限制.

可以这样做吗?有没有人知道任何具有类似复杂头的应用程序(或更好的代码示例)?我能够找到的所有其他示例都是微不足道的标题:按钮,文本视图或图像(在线和SO),几乎没有趣味的样式.

android listview header styling

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

在TinyMCE插件中使用jQuery

我正在为TinyMCE编写一个插件,我想使用jQuery对正在编辑的文档进行一些操作.

我不是在寻找一种方法来使用TinyMCE jQuery(例如选择器上的.tinymce()方法),我知道有解决方案.

基本上我需要在TinyMCE生成的iframe中包含jQuery.

tinymce.dom.ScriptLoader似乎加载在父窗口中,而不是iframe中,所以这不是一个选项.

到目前为止我尝试过的:

  • 通过父级和插件上下文中的ScriptLoader加载jquery(后者完全没有效果,前者在错误的上下文中加载它)
  • 访问window.parent.$,这是未定义的(即使它在父窗口中加载)
  • RTFM和谷歌搜索但没有相关的点击.如果插件打开一个对话框,那么可以选择加载其他javascript,但这也不是我需要的.

有人在TinyMCE插件中使用jQuery吗?怎么样?

更新/解决

感谢Thariama的建议,我能够让它发挥作用.您可以使用显式的tinymce.get()来获取编辑器,也可以使用传递给插件的init()方法的'ed'实例.然而事实证明,在初始阶段,你不能(还)以这种方式访问​​父节点.您可以在特定的处理程序中执行此操作.

例如

(function($) {
  tinymce.create('tinymce.plugins.SOSamplePlugin', {
    init: function(ed, url) {
        $ = ed.getWin().parent.jQuery; // <- WON'T WORK!

        ed.addCommand('soCmd', function(ui, v) {
            if(e = ed.selection.getNode()) {
                $ = ed.getWin().parent.jQuery; // <- WORKS!
                $(e).wrap('<div class="sample" />');
                ed.execCommand("mceRepaint");
            }
        });
        ed.addButton('SO', {
           title: 'Title',
           cmd: 'soCmd',
           image: 'somebutton.png'
        });
    },
    getInfo: function() {
        return {
            longname: 'Example Plugin',
            author: 'Ivo',
            authorurl: 'http://vanderwijk.info/',
            infourl: 'http://vanderwijk.info',
            version: '1.0'
        };
    }
  });
  tinymce.PluginManager.add('so', tinymce.plugins.SOSamplePlugin); …
Run Code Online (Sandbox Code Playgroud)

jquery plugins tinymce

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

如何摆脱恼人的"newNode:node,offset:number"弹出窗口(intellisense?)

当使用Visual Studio Code编辑javascript时,我不断得到一个无用且突兀的弹出窗口,显示某种不相关的方法签名

在此输入图像描述

键入时也不会消失.即使转义也不会删除它,但通常会点击其他代码.

我当前的用户配置如下所示

// Place your settings in this file to overwrite the default settings
{
    "python.pythonPath": "/home/ivo/Atom/bin/python",
    "python.linting.pylintEnabled": false,
    "python.linting.flake8Enabled": true,
    "python.unitTest.nosetestsEnabled": true,
    "python.unitTest.nosetestPath": "bin/django",
    "python.unitTest.nosetestArgs": ["test", "apps/"],
    "python.unitTest.unittestEnabled": false,
    "editor.acceptSuggestionOnEnter": false,
    "editor.fontSize": 13,
    "editor.renderControlCharacters": true,
    "editor.useTabStops": false,
    "editor.suggestOnTriggerCharacters": false,
    "editor.wordBasedSuggestions": false,
    "editor.quickSuggestions": false
}
Run Code Online (Sandbox Code Playgroud)

visual-studio-code

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