小编Bra*_*mon的帖子

Python模块开发工作流程 - 设置和构建

我正在编写我的第一个Python模块,我想知道物流:具体来说,人们如何处理设置/构建.

它是标准的做法,所有的开始了distutils在地方的东西,并在virtualenv运行setup.py的每次修改和测试等?

人们更经常创建一个工作代码,然后担心将其转换为可分发的包吗?

非常具体的示例问题:我的代码需要访问数据文件.我应该只是在文件地址中硬编码,DATA_FILE_PATH = "./data/DATA.npz"或者我应该从一开始就弄清楚如何使用所有这些MANIFEST.in/ setup(..., package_data={ ... }, ...)东西?


编辑:@LukasGraf的这个惊人的答案提供了一些很棒的工作流程信息,很大程度上回答了我的问题.请给他一些赞成票!

python workflow distribution package

10
推荐指数
0
解决办法
2938
查看次数

了解请求与问候

我正在使用一个基本如下的过程:

  1. 拿一些网址列表.
  2. Response从每个人获取一个对象.
  3. text每个Response 创建一个BeautifulSoup对象.
  4. 从该BeautifulSoup对象中拉出某个标签的文本.

根据我的理解,这对于问候来说似乎是理想的:

GRequests允许您使用带有Gevent的请求来轻松地进行异步HTTP请求.

但是,这两个进程(一个有请求,一个有grequests)似乎让我得到了不同的结果,其中一些请求在grequest中返回None而不是响应.

使用请求

import requests

tickers = [
    'A', 'AAL', 'AAP', 'AAPL', 'ABBV', 'ABC', 'ABT', 'ACN', 'ADBE', 'ADI', 
    'ADM',  'ADP', 'ADS', 'ADSK', 'AEE', 'AEP', 'AES', 'AET', 'AFL', 'AGN', 
    'AIG', 'AIV', 'AIZ', 'AJG', 'AKAM', 'ALB', 'ALGN', 'ALK', 'ALL', 'ALLE',
    ]

BASE = 'https://finance.google.com/finance?q={}'

rs = (requests.get(u) for u in [BASE.format(t) for t in tickers])
rs = list(rs)

rs
# [<Response [200]>,
 # <Response [200]>,
 # <Response [200]>, …
Run Code Online (Sandbox Code Playgroud)

python httprequest python-3.x python-requests grequests

10
推荐指数
2
解决办法
2798
查看次数

python函数字节码中的零是什么意思?

我正在尝试自学python字节码是如何工作的,所以我可以通过操作函数的代码来做一些事情(只是为了好玩,而不是用于实际用途)所以我从一些简单的例子开始,例如:

def f(x):
    return x + 3/x
Run Code Online (Sandbox Code Playgroud)

字节码是*:

(124, 0, 0, 100, 1, 0, 124, 0, 0, 20, 23, 83)
Run Code Online (Sandbox Code Playgroud)

因此,它是有道理的,我认为124LOAD_FAST字节码,并且正在加载的对象的名称是f.__code__.co_varnames[0]这里0后是多少124.并100表示LOAD_CONST加载f.__code__.co_consts[1]在那里1是在数字后100.但是有一堆辅助零,比如第二个,第三个和第五个零,似乎没有任何意义,至少对我而言.他们表示什么?

文本字节码:

>>> dis.dis(f)
  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               1 (3)
              6 LOAD_FAST                0 (x)
              9 BINARY_DIVIDE       
             10 BINARY_ADD          
             11 RETURN_VALUE   
Run Code Online (Sandbox Code Playgroud)

*注意:在Python 3中(字节码可能与上面不同),可以通过以下方式找到字节码:

>>> list(f.__code__.co_code)
[124, 0, 100, 1, 124, 0, 27, 0, 23, 0, 83, 0]
Run Code Online (Sandbox Code Playgroud)

python bytecode

9
推荐指数
2
解决办法
550
查看次数

df.loc导致SettingWithCopyWarning警告消息

我的代码的以下行导致警告:

import pandas as pd

s = pd.DataFrame(np.random.randint(0,100,size=(100, 4)), columns=list('ABCD'))
s.loc[-1] = [5,np.nan,np.nan,6]
grouped = s.groupby(['A'])
for key_m, group_m in grouped:
    group_m.loc[-1] = [10,np.nan,np.nan,10]

C:\Anaconda3\lib\site-packages\ipykernel\__main__.py:10: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame
Run Code Online (Sandbox Code Playgroud)

根据文档,这是推荐的做法,所以发生了什么?

谢谢你的帮助.

python pandas chained-assignment

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

了解aiohttp.TCPConnector池和连接限制

我正在试验limitlimit_per_host参数aiohttp.connector.TCPConnector.

在下面的脚本中,我connector = aiohttp.connector.TCPConnector(limit=25, limit_per_host=5)转到aiohttp.ClientSession,然后打开2个请求到docs.aiohttp.org和3到github.com.

结果session.request是一个实例aiohttp.ClientResponse,在这个例子中我故意不.close()通过.close()或者调用它__aexit__.我认为这会使连接池保持打开状态,并减少与(host,ssl,port)三倍的可用连接数-1.

下表表示._available_connections()每个请求之后. 即使在完成对docs.aiohttp.org的第二次请求后,为什么数字仍为4? 这两个连接可能仍然是开放的,尚未访问._content或已关闭.可用连接不应减少1吗?

After Request Num.        To                    _available_connections
1                         docs.aiohttp.org      4
2                         docs.aiohttp.org      4   <--- Why?
3                         github.com            4
4                         github.com            3
5                         github.com            2
Run Code Online (Sandbox Code Playgroud)

此外,为什么._acquired_per_host只包含1个键? 我想我可能会理解的方法TCPConnector; 是什么解释了上面的行为?

完整脚本:

import aiohttp


async def main():
    connector = aiohttp.connector.TCPConnector(limit=25, limit_per_host=5)

    print("Connector arguments:")
    print("_limit:", connector._limit)
    print("_limit_per_host:", connector._limit_per_host)
    print("-" …
Run Code Online (Sandbox Code Playgroud)

python python-3.x python-asyncio aiohttp

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

Gunicorn 或 uwsgi 都比 Django WSGI 服务器慢约 30 倍

我有一个 Django 应用程序。它使用 Nginx,位于 EC2 实例上,并在其前面使用 AWS 负载均衡器。Nginx 直接从磁盘提供静态文件,并proxy_pass用于路由到 WSGI 应用程序服务器的所有其他内容。

这是我看到令人费解的结果的 WSGI 服务器的选择。

当我使用Django开发服务器,./manage.py runserver 0.0.0.0:8000,平均响应时间在生成的HTML文档/60-70毫秒

Blocked: 1 ms
DNS resolution: 0 ms
Connecting: 0 ms
TLS setup: 0 ms
Sending: 0 ms
Waiting: 68 ms
Receiving: 0 ms
Run Code Online (Sandbox Code Playgroud)

现在,当我用“合适的” Gunicorn 服务器替换它时,同一请求/文档的平均响应时间现在是1800 毫秒

Blocked: 1 ms
DNS resolution: 0 ms
Connecting: 0 ms
TLS setup: 0 ms
Sending: 0 ms
Waiting: 1859 ms
Receiving: 0 ms
Run Code Online (Sandbox Code Playgroud)

在这里,我将 Gunicorn 运行为: …

python django nginx python-3.x gunicorn

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

类型错误:字段“id”需要一个数字,但得到 &lt;django.contrib.auth.models.AnonymousUser object at 0x048C7E90&gt;

Cannot cast AnonymousUser to int.
Are you trying to use it in place of User?
Run Code Online (Sandbox Code Playgroud)

当我向我的网址发出发布请求时,我不确定如何调整我的代码以停止生成此错误。我已附加序列化器、视图和模型的代码。

class ActivitySessionSerializer(serializers.Serializer):
    activity_name = serializers.CharField(min_length=1, max_length=100)

    def create(self, validated_data):
        activity, created = Activity.objects.get_or_create(name=validated_data['activity_name'], 
        owner=self.context['request'].user)

        return ActivitySession.objects.create(activity=activity, start_time=datetime.datetime.now())



class StartSessionView(generics.CreateAPIView):
    serializer_class = serializers.ActivitySessionSerializer


    User = get_user_model()
    
    class ActivityType(models.Model):
        name = models.CharField(max_length=100)
        user = models.ForeignKey(User, on_delete=models.CASCADE)

    class Activity(models.Model):
        name = models.CharField(max_length=100)
        owner = models.ForeignKey(User, on_delete=models.CASCADE)
        activity_type = models.ForeignKey(ActivityType, on_delete=models.CASCADE, null=True, blank=True)

    class ActivitySession(models.Model):
        activity = models.ForeignKey(Activity, on_delete=models.CASCADE)
        start_time = models.DateTimeField()
        end_time = models.DateTimeField()


    urlpatterns = [ …
Run Code Online (Sandbox Code Playgroud)

python post django-rest-framework

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

pandas 显示:截断列显示而不是换行

由于列名很长,无论设置什么选项,DataFrame 都会以非常混乱的形式显示。

信息:我在 Jupyter QtConsole、pandas 0.20.1 中,在启动时指定了以下相关选项:

pd.set_option('display.max_colwidth', 20)
pd.set_option('expand_frame_repr', False)
pd.set_option('display.max_rows', 25)
Run Code Online (Sandbox Code Playgroud)

问题:如果需要,如何截断 DataFrame,而不是将列换行到下一行,同时保留expand_frame_repr=False

这是一个例子。同样,问题不取决于列数,而是取决于列的长度。

这不会引起问题:

df = pd.DataFrame(np.random.randn(1000, 1000),
                  columns=['col' + str(i) for i in range(1000)])
Run Code Online (Sandbox Code Playgroud)

因为输出是完全可读的并且看起来像: 在此输入图像描述

具有长列名的相同 DataFrame 会导致我正在讨论的问题:

df = pd.DataFrame(np.random.randn(1000, 1000),
                  columns=['very_long_col_name_' 
                           + str(i) for i in range(1000)])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

有什么方法可以使第二个输出与我缺少的第一个输出一致?(通过指定一个选项,而不是通过.iloc每次我想查看时使用。)

python pandas jupyter-console

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

使用asyncio.Queue进行生产者-消费者流

我对如何使用asyncio.Queue特定的生产者-消费者模式感到困惑,在该模式中,生产者和消费者都可以同时独立运行。

首先,请考虑以下示例,该示例紧随docs中的asyncio.Queue示例:

import asyncio
import random
import time

async def worker(name, queue):
    while True:
        sleep_for = await queue.get()
        await asyncio.sleep(sleep_for)
        queue.task_done()
        print(f'{name} has slept for {sleep_for:0.2f} seconds')

async def main(n):
    queue = asyncio.Queue()
    total_sleep_time = 0
    for _ in range(20):
        sleep_for = random.uniform(0.05, 1.0)
        total_sleep_time += sleep_for
        queue.put_nowait(sleep_for)
    tasks = []
    for i in range(n):
        task = asyncio.create_task(worker(f'worker-{i}', queue))
        tasks.append(task)
    started_at = time.monotonic()
    await queue.join()
    total_slept_for = time.monotonic() - started_at
    for task in tasks:
        task.cancel() …
Run Code Online (Sandbox Code Playgroud)

python python-3.x async-await python-asyncio

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

在 statsmodels OLS 类中使用分类变量

我想使用statsmodelsOLS 类来创建多元回归模型。考虑以下数据集:

import statsmodels.api as sm
import pandas as pd
import numpy as np

dict = {'industry': ['mining', 'transportation', 'hospitality', 'finance', 'entertainment'],
  'debt_ratio':np.random.randn(5), 'cash_flow':np.random.randn(5) + 90} 

df = pd.DataFrame.from_dict(dict)

x = data[['debt_ratio', 'industry']]
y = data['cash_flow']

def reg_sm(x, y):
    x = np.array(x).T
    x = sm.add_constant(x)
    results = sm.OLS(endog = y, exog = x).fit()
    return results
Run Code Online (Sandbox Code Playgroud)

当我运行以下代码时:

reg_sm(x, y)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

TypeError: '>=' not supported between instances of 'float' and 'str'
Run Code Online (Sandbox Code Playgroud)

我已经尝试将industry变量转换为分类变量,但仍然出现错误。我别无选择。

python pandas statsmodels

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