虽然我对Python的*args和**kwargs有一般的了解(我认为),但我很难理解如何将它们从一个函数传递到另一个函数.这是我的模特:
from pdb import set_trace as debug
from django.db import models
class Person(models.Model):
name = models.CharField(max_length=30)
def __unicode__(self):
return u'%s' % self.name
def save_name_for(self, *args, **kwargs):
self.name = 'Alex'
return self
def save_name(self, *args, **kwargs):
debug()
self.save_name_for(self, args, kwargs)
self.save()
Run Code Online (Sandbox Code Playgroud)
我将名称分成两个以上的函数.这样我就可以通过对save_name_for方法进行单元测试来对我通常将所有逻辑进行单元测试.
当我在解释器中运行它并在save_name方法中停止时,正如我所料,我看到:
(Pdb) args
self =
args = (1, 2)
kwargs = {'last': 'Doe', 'first': 'John'}
Run Code Online (Sandbox Code Playgroud)
如果我然后进入save_name_for方法,我会看到:
(Pdb) args
self =
args = (<Person: >, (1, 2), {'last': 'Doe', 'first': 'John'})
kwargs =
Run Code Online (Sandbox Code Playgroud)
有没有办法将save_name方法接收到的kwargs直接传递给save_name_for方法,以便它们出现在后者的kwargs中?我想在save_name_for方法的名称空间中看到类似的内容:
(Pdb) args
self =
args = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用factory_boy测试两个Django模型之间的多对多关系.factory_boy文档似乎没有讨论这个问题,我无法弄清楚我做错了什么.当我运行第一个测试时,我得到错误"AttributeError:'Pizza'对象没有属性'顶部'".第二次测试我得到了类似的错误.
当我在调试器中运行测试时,我可以看到"浇头"对象,但它不知道如何从中获取名称.我是否正确定义了PizzaFactory的_prepare方法?当你有多对多的关系时,如何从另一个表中访问一个表中的名称?
谢谢.
from django.db import models
class Topping(models.Model):
name = models.CharField(max_length=50)
def __unicode__(self):
return self.name
class Pizza(models.Model):
name = models.CharField(max_length=100)
toppings = models.ManyToManyField(Topping)
def __unicode__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
import factory
from models import Topping, Pizza
class ToppingFactory(factory.Factory):
name = 'mushrooms'
class PizzaFactory(factory.Factory):
name = 'Vegetarian'
@classmethod
def _prepare(cls, create, **kwargs):
topping = ToppingFactory()
pizza = super(PizzaFactory, cls)._prepare(create, **kwargs)
pizza.toppings.add(topping)
return pizza
Run Code Online (Sandbox Code Playgroud)
from django.test import TestCase
import factory
from app.models import Topping, Pizza
from app.factories import ToppingFactory, PizzaFactory …
Run Code Online (Sandbox Code Playgroud) 当建立一个新的Linux服务器,我通常跑apt-get update
后apt-get upgrade
.第一个命令更新可用软件包及其版本的列表,但它不会安装或升级任何软件包.第二个命令实际上安装了我的软件包的更新版本.
在Ansible中执行此操作的正确方法是什么?你可以这样做的一种方法是这样的:
- name: update and upgrade apt packages
apt: >
upgrade=yes
update_cache=yes
cache_valid_time=3600
Run Code Online (Sandbox Code Playgroud)
或者你可以分两步完成:
- name: update apt packages
apt: >
update_cache=yes
cache_valid_time=3600
- name: upgrade apt packages
apt: upgrade=yes
Run Code Online (Sandbox Code Playgroud)
如果你是第一种方式,Ansible足够聪明,知道它应该在'升级'之前运行'更新'吗?Ansible apt文档没有解决这个问题.
是否有任何方法可以抑制(即隐藏)测试失败或生成错误时工厂男孩生成的捕获的日志信息块?我在说这个:
SomeError: you encountered an error
----------- >> begin captured loggin << -----------
... DEBUG information
----------- >> end captured loggin << -------------
---------------------------------------------------
Ran 1 test...
Run Code Online (Sandbox Code Playgroud)
通常情况下,这些信息与解决问题无关或不必要,而且我需要向上滚动以查看导致错误的原因.
谢谢.
我试图弄清楚如何从 Mac 上的终端命令行打开 Mac 版本的 VS Code,这里的问题说打开命令面板并发出以下两个命令之一:
shell command
install code
Run Code Online (Sandbox Code Playgroud)
在我的计算机上,这两个命令都会导致响应“没有匹配的命令”。我需要安装任何特殊的扩展才能使其正常工作吗?我运行的是 macOS 11.1 和 VS Code 1.52.1。
我有一个Django应用程序,我最近升级到Django 1.8.4.我正在使用机头1.3.7和django-nose 1.4.1为我的测试运行器运行200多个集成和单元测试.自从升级Django和nose以来,我发现我的12个测试失败并出现同样的错误:
======================================================================
ERROR: Failure: RuntimeError (Conflicting 'c' models in application 'nose': <class 'account.tests.form_tests.TestAddress'> and <class 'nose.util.C'>.)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Users/me/venv/myproj/lib/python2.7/site-packages/nose/loader.py", line 523, in makeTest
return self._makeTest(obj, parent)
File "/Users/me/venv/myproj/lib/python2.7/site-packages/nose/loader.py", line 568, in _makeTest
obj = transplant_class(obj, parent.__name__)
File "/Users/me/venv/myproj/lib/python2.7/site-packages/nose/util.py", line 644, in transplant_class
class C(cls):
File "/Users/me/venv/myproj/lib/python2.7/site-packages/django/db/models/base.py", line 311, in __new__
new_class._meta.apps.register_model(new_class._meta.app_label, new_class)
File "/Users/me/venv/myproj/lib/python2.7/site-packages/django/apps/registry.py", line 223, in register_model
(model_name, app_label, app_models[model_name], model))
RuntimeError: Conflicting 'c' models in application 'nose': <class 'account.tests.form_tests.TestAddress'> and <class …
Run Code Online (Sandbox Code Playgroud) 我有以下 PostgreSQL 函数,它从表中返回多列:
CREATE OR REPLACE FUNCTION userbyid(id integer)
RETURNS TABLE(id int, username character varying(30), email character varying(254), last_login timestamp with time zone) AS
$$
SELECT
id,
username,
email,
last_login
FROM
auth_user
WHERE
id = $1;
$$
LANGUAGE 'sql';
Run Code Online (Sandbox Code Playgroud)
它返回的结果如下所示:
userbyid
--------------------------------------------------------------
(2, smith, smith@example.com, "2017-06-04 19:47:49.472259+00")
Run Code Online (Sandbox Code Playgroud)
是否可以使用正确的列标题显示输出,如下所示:
id username email last_login
--------------------------------------------------------------
2 smith smith@example.com 2017-06-04
Run Code Online (Sandbox Code Playgroud)
我正在查看 CREATE FUNCTION 文档页面,但不清楚如何执行此操作。我也在网上查了一下,没有看到讨论这个问题的文章。
我在进行Django日志记录时遇到了麻烦。我已经阅读了有关日志记录的Python和Django文档,但仍然看不到我在做什么错。首先,我只是想在执行以下简单视图时将消息记录到运行Django开发服务器的控制台上:
# demo/views.py
import logging
logger = logging.getLogger(__name__)
def demo_logging(request, template):
logger.error("Got some error")
return render(request, template)
Run Code Online (Sandbox Code Playgroud)
我正在使用Django的默认日志记录设置,该设置是在我的设置文件中的django / utils / log.py中指定的,以便(希望)我确切地知道正在发生什么(显然我不知道):
# settings.py
DEBUG = True
...
LOGGING_CONFIG = None
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'handlers': {
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
},
'null': {
'class': 'logging.NullHandler',
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django': …
Run Code Online (Sandbox Code Playgroud) 我正在学习pipenv,有些事情我不太了解。显然,您的Pipfile可以包含两个部分:
[packages]
...
[dev-packages]
....
Run Code Online (Sandbox Code Playgroud)
据我了解,“软件包”部分列出了您安装的软件包。但是“开发包”部分的作用是什么?与“包裹”部分有何不同?
我在 Mac 上使用 VS Code 编写 Python 代码。我在项目文件夹中创建了一个名为“venv”的虚拟环境,并在项目文件夹中打开了 VS Code。我可以在资源管理器窗格中看到 venv 文件夹。但是,如果我将包安装到虚拟环境中,并尝试将该包导入到 Python 模块中,然后运行该模块,VS Code 会引发 ModuleNotFound 错误,指出不存在模块。
我按照 VS Code 文档在 VS Code 中使用 Python 环境中的说明进行操作,打开命令面板,选择 Python:选择解释器,然后选择“venv/bin/folder”。但是当我这样做时,我收到此错误:
Failed to set 'pythonPath'. Error: Unable to write into folder settings. Please open the 'my_project' folder settings to correct errors/warnings in it and try again.
Run Code Online (Sandbox Code Playgroud)
这些“文件夹设置”是什么?我在上面引用的文档中没有看到任何有关虚拟环境目录的文件夹设置的内容。
环境:
VS Code 1.35.1
Python for VS Code 0.2.3
Python 3.7.1
更新
采纳@khuynh的建议,我打开settings.json并发现一个错误,那就是我试图用“//”注释掉一行。我没有意识到 JSON 文件不能包含注释。
删除该行后,我再次运行“Python:选择解释器”,但这一次.vscode > settings.json >> code-runner.executorMap.python
出现了顶部的选项卡。该选项卡包含以下代码:
{
"python.pythonPath": "/usr/local/bin/python3" …
Run Code Online (Sandbox Code Playgroud) django ×3
python ×3
factory-boy ×2
ansible ×1
apt ×1
logging ×1
macos ×1
nose ×1
pipenv ×1
postgresql ×1
sql ×1
unit-testing ×1