我有一堆单元测试,它们不是/python2.7/site-packages/从一个完全不同的目录导入东西.所以我所做的是在每个测试文件中进行一些猴子修补,sys.path.append以使我的Python看到我需要的东西.
有没有办法在sys.path不影响每个文件的情况下全局附加整个Pycharm项目?
更新:设置默认工作目录没有帮助.例如,如果我将工作目录设置为/Users/1111/_projects/_empty_dir/如此:

然后运行它
import sys
for p in sys.path: print p
Run Code Online (Sandbox Code Playgroud)
我看到的就是这个
/Users/1111/.virtualenvs/blesk/bin/python /Users/1111/_projects/_testing_pycharm/importer.py
/Users/1111/_projects/_testing_pycharm
/Users/1111/.virtualenvs/blesk/lib/python2.7/site-packages/six-1.9.0-py2.7.egg
/Users/1111/.virtualenvs/blesk/lib/python2.7/site-packages/parse-1.6.6-py2.7.egg
/Users/1111/_projects/_testing_pycharm
/Users/1111/.virtualenvs/blesk/lib/python27.zip
/Users/1111/.virtualenvs/blesk/lib/python2.7
/Users/1111/.virtualenvs/blesk/lib/python2.7/plat-darwin
/Users/1111/.virtualenvs/blesk/lib/python2.7/plat-mac
/Users/1111/.virtualenvs/blesk/lib/python2.7/plat-mac/lib-scriptpackages
/Users/1111/.virtualenvs/blesk/lib/python2.7/lib-tk
/Users/1111/.virtualenvs/blesk/lib/python2.7/lib-old
/Users/1111/.virtualenvs/blesk/lib/python2.7/lib-dynload
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac
/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages
/Users/1111/.virtualenvs/blesk/lib/python2.7/site-packages
Process finished with exit code 0
Run Code Online (Sandbox Code Playgroud)
并没有/Users/1111/_projects/_empty_dir/上sys.path.
我有一个基于类的管理员视图:
class All_RDPs(BaseView):
@expose('/')
def index(self):
return 'ok1'
@expose('/test')
def testindex(self):
return 'ok2'
Run Code Online (Sandbox Code Playgroud)
这是在Flask-Admin中注册的,如下所示:
admin.add_view(All_RDPs(name='dep_rdp'))
Run Code Online (Sandbox Code Playgroud)
然后可以从浏览器中查看,如下所示:
http://localhost/admin/all_rdps/
http://localhost/admin/all_rdps/test
Run Code Online (Sandbox Code Playgroud)
问题是:
all_rdps?url_for这些端点生成网址?url_for('admin.All_RDPs.testindex'),url_for('admin.All_RDPs')不要工作.我试图绕过Tornado和异步连接到Postgresql.我找到了一个可以在http://peewee-async.readthedocs.io/en/latest/上执行此操作的库.
我设计了一个小测试来比较传统的Peewee和Peewee-async,但不知何故异步工作得更慢.
这是我的应用:
import peewee
import tornado.web
import logging
import asyncio
import peewee_async
import tornado.gen
import tornado.httpclient
from tornado.platform.asyncio import AsyncIOMainLoop
AsyncIOMainLoop().install()
app = tornado.web.Application(debug=True)
app.listen(port=8888)
# ===========
# Defining Async model
async_db = peewee_async.PooledPostgresqlDatabase(
'reminderbot',
user='reminderbot',
password='reminderbot',
host='localhost'
)
app.objects = peewee_async.Manager(async_db)
class AsyncHuman(peewee.Model):
first_name = peewee.CharField()
messenger_id = peewee.CharField()
class Meta:
database = async_db
db_table = 'chats_human'
# ==========
# Defining Sync model
sync_db = peewee.PostgresqlDatabase(
'reminderbot',
user='reminderbot',
password='reminderbot',
host='localhost'
)
class SyncHuman(peewee.Model):
first_name = peewee.CharField() …Run Code Online (Sandbox Code Playgroud) 我需要在序列化程序中添加一个静态字段.无论传递的对象如何,它应始终返回相同的值.目前我实现它是这样的:
class QuestionSerializer(serializers.ModelSerializer):
type = serializers.SerializerMethodField()
@staticmethod
def get_type(obj):
return 'question'
class Meta:
model = Question
fields = ('type',)
Run Code Online (Sandbox Code Playgroud)
但有没有更简单的方法来做到这一点SerializerMethodField?
Pycharm 的解释器似乎已经停止理解我的一些控制台命令。它不断识别默认的 shell 命令,但不识别已安装的实用程序。
例如,subprocess模块理解touch命令但不理解heroku命令。
有趣的是,当我在控制台中输入相同的字符串时,使用相同的解释器(来自相同的 virtualenv),一切正常。
视觉示例:
几天前它停止工作,在此之前一切正常。
我以为我搞砸了我的一些环境变量,但打开了一个我一个月没碰过的旧项目,发现同样的subprocess命令在那里也停止工作了。
可能是什么问题呢?
更新
好的,我让这件事起作用了。
os.environ['PATH']控制台和 Pycharm 中的值不同。在我将正确的 PATH 添加到 Pycharm 配置环境变量后,一切又开始工作了。
现在的问题是,如何避免在我的每个项目中检查每个配置并在任何地方添加这个新 PATH?有没有办法在全局范围内执行此操作并修复这个唯一已损坏的设置?
我有以下webpack配置:
const path = require('path');
const webpack = require('webpack');
const CleanWebpackPlugin = require('clean-webpack-plugin');
module.exports = {
entry: {
source1: './frontend/source1.js',
source2: './frontend/source2.js'
},
output: {
filename: '[name].bundle.js',
path: path.resolve(__dirname, 'static/bundles')
},
plugins: [
new CleanWebpackPlugin(['static/bundles'])
],
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader', // ??? .vue-??????
options: {
loaders: {
}
// other vue-loader options go here
}
},
{
test: /\.js$/,
exclude: /node_modules/,
loader: "babel-loader"
}
]
},
resolve: {
alias: {
vue$: 'vue/dist/vue.esm.js'
}
}
}; …Run Code Online (Sandbox Code Playgroud) 我需要在使用夹具后显式删除它。我知道 pytest-django 默认情况下会在拆卸时删除所有对象,但在这种特殊情况下,我需要手动执行此操作。然而,虽然我的测试被标记为pytest.mark.django_db,但我能够创建一个固定装置,但无法在一行后删除它yield:
import pytest
from tgapps.models import TelegramApp
@pytest.fixture(scope='module')
def some_fixture():
app = TelegramApp.objects.create(
session_data=b'\xa2\x8f#',
app_owner_phone=79856235474,
app_id=182475,
app_hash='aad9ab4384fea1af0342b77b606d13b0'
)
yield app
print('deleting object...')
app.delete()
class TestTelegramServiceObject(object):
@pytest.mark.django_db
def test1(self, some_fixture):
print('Fixture created:')
print(some_fixture)
Run Code Online (Sandbox Code Playgroud)
这是我的测试输出:
============================= test session starts ==============================
platform darwin -- Python 3.6.4, pytest-3.4.0, py-1.5.2, pluggy-0.6.0
Django settings: inviter.settings.staging (from ini file)
rootdir: /Users/1111/_projects/fasttrack/inviter, inifile: pytest.ini
plugins: mock-1.7.1, dotenv-0.1.0, django-3.1.2
collected 1 item
test_example.py E.Fixture created:
<79856235474 - 182475>
deleting object...
tests/api/test_example.py:25 (TestTelegramServiceObject.test1)
@pytest.fixture(scope='module') …Run Code Online (Sandbox Code Playgroud) 我无法让 mypy 与 mixin 一起正常工作:它一直抱怨我的 mixins 引用了缺少的属性。考虑这个例子:
class PrintValueMixin:
"""A mixin that displays values"""
def print_value(self) -> None:
print(self.value)
class Obj(PrintValueMixin):
"""An object that stores values. It needs a mixin to display its values"""
def __init__(self, value):
self.value = value
instance = Obj(1)
instance.print_value()
Run Code Online (Sandbox Code Playgroud)
如果我在这个文件上运行 mypy,我会收到一个错误:
error: "PrintValueMixin" has no attribute "value"
Run Code Online (Sandbox Code Playgroud)
当然它没有属性“值”。它是一个mixin,它不应该有自己的属性!
那么我如何让 mypy 理解这一点呢?
当我创建一个扩展逻辑的 mixin 类时__init__,通常要做的是:
class ExtraValuemixin:
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
# some extra initialization
self._extra_value = 1
def retrieve_extra_value(self):
return self._extra_value
Run Code Online (Sandbox Code Playgroud)
然而,这对 mypy 来说似乎是错误的,正如它所说:
Too many arguments for "__init__" of "object"
Run Code Online (Sandbox Code Playgroud)
我明白了,在的构造函数签名中没有*argsor ;但这是一个 mixin,它依赖于它的孩子的构造函数。我如何让 mypy 理解这一点?**kwargsobject
完整示例:
class ExtraValuemixin:
def __init__(self, *args, **kwargs) -> None:
super().__init__(*args, **kwargs)
# some extra initialization
self._extra_value = 1
def retrieve_extra_value(self):
return self._extra_value
class ParentObj:
def __init__(self, value):
self.value = value
class ChildObj(ExtraValuemixin, ParentObj):
pass
obj …Run Code Online (Sandbox Code Playgroud) 考虑以下模型定义和用法:
from django.db import models
class User(models.Model):
name: str = models.CharField(max_length=100)
def do_stuff(user: User) -> None:
# accessing existing field
print(user.name.strip())
# accessing existing field with a wrong operation: will fail at runtime
print(user.name + 1)
# acessing nonexistent field: will fail at runtime
print(user.name_abc.strip())
Run Code Online (Sandbox Code Playgroud)
mypy在此基础上运行时,我们将收到以下错误消息user.name + 1:
error: Unsupported operand types for + ("str" and "int")
Run Code Online (Sandbox Code Playgroud)
这可以。但是代码中还有另一个错误- user.name_abc不存在,将在运行时导致AttributeError。
但是,mypy不会看到此信息,因为它允许代码访问任何django属性,并将它们也视为Any:
u = User(name='abc')
reveal_type(user.abcdef)
....
> error: Revealed type is 'Any
Run Code Online (Sandbox Code Playgroud)
那么,如何使mypy看到此类错误?
python ×6
django ×3
mypy ×3
pycharm ×2
flask ×1
flask-admin ×1
peewee ×1
postgresql ×1
pytest ×1
subprocess ×1
tornado ×1
webpack ×1