小编bag*_*rat的帖子

什么是Pythonic方式进行依赖注入?

介绍

对于Java,依赖注入作为纯OOP工作,即您提供要实现的接口,并在您的框架代码中接受实现已定义接口的类的实例.

现在对于Python,您可以以相同的方式执行,但我认为在Python的情况下,该方法的开销太大了.那么你将如何以Pythonic方式实现它?

用例

说这是框架代码:

class FrameworkClass():
    def __init__(self, ...):
        ...

    def do_the_job(self, ...):
        # some stuff
        # depending on some external function
Run Code Online (Sandbox Code Playgroud)

基本方法

最天真(也许是最好的?)方式是要求将外部函数提供给FrameworkClass构造函数,然后从该do_the_job方法调用.

框架代码:

class FrameworkClass():
    def __init__(self, func):
        self.func = func

    def do_the_job(self, ...):
        # some stuff
        self.func(...)
Run Code Online (Sandbox Code Playgroud)

客户代码:

def my_func():
    # my implementation

framework_instance = FrameworkClass(my_func)
framework_instance.do_the_job(...)
Run Code Online (Sandbox Code Playgroud)

问题很简短.有没有更好的常用Pythonic方法来做到这一点?或者也许任何支持此类功能的库?

更新:具体情况

想象一下,我开发了一个微型Web框架,它使用令牌处理身份验证.该框架需要一个函数来提供ID从令牌获得的一些并获得与之对应的用户ID.

显然,框架对用户或任何其他特定于应用程序的逻辑一无所知,因此客户端代码必须将用户getter功能注入框架以使身份验证工作.

python oop authentication frameworks dependency-injection

63
推荐指数
5
解决办法
2万
查看次数

在django中使用RESTFUL API中的数据的正确方法

我正在尝试学习django,所以当我有一个当前的解决方案时,我不确定它是否遵循django中的最佳实践.我想在我的网站上显示来自网络API的信息.假设api url如下:

http://api.example.com/books?author=edwards&year=2009
Run Code Online (Sandbox Code Playgroud)

Thsis将返回Edwards于2009年撰写的书籍清单.返回以下格式:

{'results':
             [
                {
                   'title':'Book 1',
                   'Author':'Edwards Man',
                   'Year':2009
                },
                {
                   'title':'Book 2',
                   'Author':'Edwards Man',
                   'Year':2009}
           ]
}
Run Code Online (Sandbox Code Playgroud)

目前我正在使用我的视图文件中的API,如下所示:

class BooksPage(generic.TemplateView):
    def get(self,request):
        r = requests.get('http://api.example.com/books?author=edwards&year=2009')
        books = r.json()
        books_list = {'books':books['results']}
        return render(request,'books.html',books_list)
Run Code Online (Sandbox Code Playgroud)

通常,我们从models.py文件中的数据库中获取数据,但我不确定是否应该在models.py或views.py中获取此API数据.如果它应该在models.py中,有人可以举例说明如何做到这一点吗?我特意为stackoverflow编写了上面的例子,所以任何bug都纯粹是在这里编写它的结果.

python django rest restful-architecture

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

Redis python 中的 HashMap 过期了吗?

我想在redis中存储以下哈希图:

"data": {
       "name": "XYZ",
       "age": 22,
       "address": "a-z"
}  
Run Code Online (Sandbox Code Playgroud)

我希望整个哈希映射(带有给定的键)及时过期,比方说 72 小时。

如何使用ttl/expirePython中的函数?

python database hashmap redis python-2.7

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

是否有可能在Python中使模块可迭代?

我正在制作一个模块,我想将其视为对象的静态容器.这些对象属于我定义的类类型.我希望能够导入此模块,然后循环遍历其中的对象.以下是一些解释我的意思的代码:

example.py

class MyExampleClass(object):
    def __init__(self, var1, var2, var3):
        self.var1 = var1
        self.var2 = var2
        self.var3 = var3
        self.var4 = var4

instanceA = MyExampleClass(1, 2, 3, 4)
instanceB = MyExampleClass(4, 3, 6, 7)
instanceC = MyExampleClass(5, 3, 4, 5)

# something like this
def __iter__():
    return (instanceA, instanceB, instanceC)
Run Code Online (Sandbox Code Playgroud)

然后我希望能够导入它并像枚举一样使用它:

import example

for e in example:
   # do stuff with e
Run Code Online (Sandbox Code Playgroud)

这可以用Python做吗?或者我是否必须从example包中导入列表?

example.py

objects = (instanceA, instanceB, instanceC)
Run Code Online (Sandbox Code Playgroud)

然后

import example

for e in example.objects:
    # do stuff …
Run Code Online (Sandbox Code Playgroud)

python iterable module

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

MongoDB按平均组合数或嵌套子数组排序

有一些问题在MongoDB中找到最好的方法,可以说它是一个关系数据集,所以我可能会被定为.看看它是否有可能仍然是一个挑战.

我目前需要通过物流经理在其所在部门的货车上的每日平均里程数进行订购,并且还需要在单独的每周平均值的单独列表中订购.

数据库中的First先生设置如下

{
   "_id" : ObjectId("555cf04fa3ed8cc2347b23d7"),
   "name" : "My Manager 1",
   "vans" : [ 
       {
           "name" : "van1",
           "miles" : NumberLong(56)
       },
       {
           "name" : "van2",
           "miles" : NumberLong(34)
       }
   ]
}
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在不知道父数组键的情况下通过嵌套数组值进行排序(这些将是标准的0-x)

所以我的下一个选择是废弃这个想法,只是在第一个集合中有名称,第二个集合中的vans与经理的Id.

所以从上面的例子中移除面包车并添加这个集合(面包车)

{
   "_id" : ObjectId("555cf04fa3ed8cc2347b23d9"),
   "name" : "van1",
   "miles" : NumberLong(56),
   "manager_id" : "555cf04fa3ed8cc2347b23d7"
}
Run Code Online (Sandbox Code Playgroud)

但是因为我需要通过经理显示结果,我如何在查询中(如果可能)订购此集合中的平均里程数,其中id = x,然后按其ID显示经理.

谢谢你的帮助

php arrays mongodb

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

检查特定元素列表的更好方法 - python

我使用try/except块作为替代if/elif,有一堆ands.我正在寻找一个列表,并替换一些元素,如果它有x和x和x等.在我的项目中,我必须检查6个东西,这些吸引我使用try/exceptwith .index()将导致错误,如果元素isn不存在.

类比看起来像这样:

colors = ['red', 'blue', 'yellow', 'orange']

try:
    red_index = colors.index('red')
    blue_index = colors.index('blue')
    colors[red_index] = 'pink'
    colors[blue_index] = 'light blue'
except ValueError:
    pass
try:
    yellow_index = colors.index('yellow')
    purple_index = colors.index('purple')
    colors[yellow_index] = 'amarillo'
    colors[purple_index] = 'lavender'
except ValueError:
    pass
Run Code Online (Sandbox Code Playgroud)

因此,如果colors数组不包含'purple'还有'yellow',我不希望阵列,以改变.

我对这种方法有点警惕,因为它似乎是滥用try/except.但是它比替代方案要短得多,因为index无论如何我都必须抓住元素,所以我想知道这是否存在明显的问题,或者这是否足够疯狂以至于其他开发人员会讨厌它.

python if-statement try-except

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

Python Sphinx锚点在任意一行

如何使用Sphinx在ReST中的任意一行设置锚点引用?

更清楚,这是一个例子:

A title with an anchor
----------------------

some stuff
Run Code Online (Sandbox Code Playgroud)

这将创建一个标题,A title with an anchor并在该行的末尾添加一个额外的悬停 ,就像标题一样.

python documentation anchor restructuredtext python-sphinx

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

Pythonic方式添加向量列表

我正在尝试创建一个方法(sum),它采用可变数量的向量并将它们添加进去.出于教育目的,我编写了自己的Vector类,并且底层数据存储在名为data的实例变量中.

我的代码@classmethod总和有效(对于传入的每个向量,循环遍历数据变量中的每个元素并将其添加到结果列表中),但它似乎不是Pythonic,并且想知道是否有更好的方法?

class Vector(object):
    def __init__(self, data):
        self.data = data

    @classmethod
    def sum(cls, *args):
        result = [0 for _ in range(len(args[0].data))]
        for v in args:
            if len(v.data) != len(result): raise
            for i, element in enumerate(v.data):
                result[i] += element

        return cls(result)
Run Code Online (Sandbox Code Playgroud)

python list

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

使用Python将此列表转换为Dictionary

list = ['Name=Sachin\n', 'country=India\n', 'game=cricket\n']
Run Code Online (Sandbox Code Playgroud)

我想这个名单在字典中的钥匙为Name,country,game和值Sachin,India,cricket作为相应的值.我readlines()从文本文件中获取了此列表.

python list

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

Laravel查询.哪里独特


我有这样的数据库表:

**job_id**
    5
    5
    5
    6
    6
    7
    8
    8
Run Code Online (Sandbox Code Playgroud)

我想编写查询,它只能选择唯一的id.说独特我的意思是只选择这些值一次:
5, 6, 7, 8

提前致谢!

php sql laravel eloquent

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