pycharm的python_stubs問題
最近在寫udp socket程序時,對幾個函數(shù)(如sendto)command+左擊時,發(fā)現(xiàn)跳轉(zhuǎn)到了這個python文件里面去了。(默認應(yīng)該是到函數(shù)源碼那里)
/PyCharm2018.1/python_stubs/160944109/_socket.py
定義了如下的偽函數(shù)
def send(self, data, flags=None): # real signature unknown; restored from __doc__ """ send(data[, flags]) -> count Send a data string to the socket. For the optional flags argument, see the Unix manual. Return the number of bytes sent; this may be less than len(data) if the network is busy. """ pass def sendall(self, data, flags=None): # real signature unknown; restored from __doc__ """ sendall(data[, flags]) Send a data string to the socket. For the optional flags argument, see the Unix manual. This calls send() repeatedly until all data is sent. If an error occurs, it's impossible to tell how much data has been sent. """ pass
google了下,發(fā)現(xiàn)已經(jīng)有人在stackoverflow提出相關(guān)問題,我這里簡單提煉一下。
https://stackoverflow.com/questions/24266114/pycharm-what-is-python-stubs
什么情況下會出現(xiàn)跳轉(zhuǎn)到python_stubs?
當我們調(diào)用的函數(shù)是內(nèi)置函數(shù)或僅二進制存在的函數(shù)(沒有py文件,只有pyc等)時,pycharm會對某個版本進行硬編碼而生成的偽函數(shù)(實際不是調(diào)用的這個,只是方便我們做開發(fā))。
想一想pycharm為了方便我們,真是煞費苦心。
補充知識:Python3自定義日志類 mylog
大家還是直接看代碼吧!
#encoding=utf-8
import os, sys
import datetime
import time
class Mylog(object):
# 根文件夾
root_dir = sys.path[0]
# 根目錄
root_path = sys.path[0] + os.path.sep
# 系統(tǒng)目錄分割線
sys_sep = os.path.sep
# 配置
option = {
# 日志級別: 0:全部,1:調(diào)試,2:警告,3:錯誤
'level': 0,
# 是否開啟,如果關(guān)閉則不輸出也不記錄日志
'is_open': True,
# 是否print輸出
'is_print': True,
# 是否記錄到日志文件
'is_write': True,
# 是否在每條日志內(nèi)容前面加前綴
'is_prefix': True,
# 如果開啟了每條日志前加前綴,設(shè)置日志級別為1的前綴
'level_1_prefix': 'Test: ',
# 如果開啟了每條日志前加前綴,設(shè)置日志級別為2的前綴
'level_2_prefix': 'Warning: ',
# 如果開啟了每條日志前加前綴,設(shè)置日志級別為3的前綴
'level_3_prefix': 'Error: ',
# 存放日志文件的根文件夾名稱
'root_dir_name': 'mylog',
# 自定義存放日志文件的文件名稱,此文件夾是在 root_dir_name 文件夾下
'dir_name': ''
}
def __init__(self, config=None):
if config is not None:
self.option.update(dict(config))
# 日志保存的文件夾(全路徑)
save_dir = self.root_path + self.option['root_dir_name']
# 創(chuàng)建文件夾
if os.path.isdir(save_dir) is not True:
os.mkdir(save_dir)
if len(self.option['dir_name']) > 0:
save_dir += self.sys_sep + self.option['dir_name']
if os.path.isdir(save_dir) is not True:
os.mkdir(save_dir)
self.save_dir = save_dir
self.save_path = save_dir + self.sys_sep
'''
輸入日志/記錄日志
'''
def log(self, content='', level=0):
self._print_log(content, level)
self._write_log(content, level)
'''
輸入日志
'''
def _print_log(self, content, level):
if self.option['is_open'] is True and self.option['is_print'] is True:
if self.option['level'] == 0 or self.option['level'] == level:
if level > 0:
content = self.option['level_' + str(level) + '_prefix'] + content
print(content)
'''
記錄日志
'''
def _write_log(self, content, level):
if self.option['is_open'] is True and self.option['is_print'] is True:
if self.option['level'] == 0 or self.option['level'] == level:
if self.option['is_prefix'] is True:
today = datetime.date.today()
file_name = str(today) + '.log'
now = time.strftime("%H:%M:%S")
log_file = self.save_path + file_name
if level > 0:
content = self.option['level_' + str(level) + '_prefix'] + content
if os.path.isfile(log_file):
save_file = open(log_file, 'a')
else:
save_file = open(log_file, 'w')
save_file.write(str(now) + "\r\n" + content + "\r\n")
save_file.close()
**重點內(nèi)容
#!/usr/bin/env python
#-*- coding: GBK -*-
__author__ = 'DiaoHuabin'
import logging
import getpass
import sys
#定義MyLog類
class MyLog(object):
'''這個類用于創(chuàng)建一個自用的log'''
def __init__(self): #類MyLog的構(gòu)造函數(shù)
user = getpass.getuser() #返回用戶的登錄名
self.logger = logging.getLogger(user) #返回一個特定名字的日志
self.logger.setLevel(logging.DEBUG) #對顯示的日志信息設(shè)置一個閾值低于DEBUG級別的不顯示
logFile = './'+sys.argv[1][0:-3] + '.log' # 日志文件名
formatter = logging.Formatter('%(asctime)-12s $(levelname)-8s %(name)-10s %(message)-12s')
'''日志顯示到屏幕上并輸出到日志文件內(nèi)'''
logHand = logging.FileHandler(logFile) #輸出日志文件,文件名是logFile
logHand.setFormatter(formatter) #為logHand以formatter設(shè)置格式
logHand.setLevel(logging.ERROR) #只有錯誤才被記錄到logfile中
logHandSt = logging.StreamHandler() #class logging.StreamHandler(stream=None)
# 返回StreamHandler類的實例,如果stream被確定,使用該stream作為日志輸出,反之,使用
#sys.stderr
logHandSt.setFormatter(formatter) #為logHandSt以formatter設(shè)置格式
self.logger.addHandler(logHand) #添加特定的handler logHand到日志文件logger中
self.logger.addHandler(logHandSt) #添加特定的handler logHandSt到日志文件logger中
'''日志的5個級別對應(yīng)以下的五個函數(shù)'''
def debug(self,msg):
self.logger.debug(msg) #Logs a message with level DEBUG on this logger.
# The msg is the message format string
def info(self,msg):
self.logger.info(msg)
def warn(self,msg):
self.logger.warn(msg)
def error(self,msg):
self.logger.error(msg)
def critical(self,msg):
self.logger.critical(msg)
if __name__ == '__main__':
mylogw = MyLog()
mylogw.debug("I'm debug")
mylogw.info("I'm info")
mylogw.warn("I'm warn")
mylogw.error("I'm error")
mylogw.critical("I'm critical")

以上這篇pycharm的python_stubs問題就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
python棧實現(xiàn)進制轉(zhuǎn)換的示例詳解
棧(Stack)是計算機科學中常用的數(shù)據(jù)結(jié)構(gòu),具有眾多實際應(yīng)用,其中之一是使用棧來實現(xiàn)進制轉(zhuǎn)換,將一個數(shù)字從一種進制表示轉(zhuǎn)換為另一種進制表示,本文將深入研究棧的原理,以及如何使用Python實現(xiàn)十進制到二進制、八進制和十六進制的進制轉(zhuǎn)換,需要的朋友可以參考下2023-11-11
python實現(xiàn)文件+參數(shù)發(fā)送request的實例代碼
這篇文章主要介紹了python實現(xiàn)文件+參數(shù)發(fā)送request的實例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01
Mac下Supervisor進程監(jiān)控管理工具的安裝與配置
這篇文章主要介紹了Mac下Supervisor進程監(jiān)控管理工具的安裝與配置,Supervisor 是由 Python 寫成,是一個類 unix 操作系統(tǒng)下的進程監(jiān)控管理工具,本文講解MAC系統(tǒng)下的配置與安裝,需要的朋友可以參考下2014-12-12

