pycharmのpython_stubs問題

最近udpソケットプログラムを書いているときに、いくつかの関数(sendtoなど)command +を左クリックすると、このpythonファイルにジャンプしたことがわかりました。 (デフォルトは関数ソースコードである必要があります)

/PyCharm2018.1/python_stubs/160944109/_socket.py

以下の疑似関数が定義されています

 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

グーグルで検索したところ、誰かがすでにスタックオーバーフローに関連する質問をしていることがわかりました。ここで簡単に説明します。

https://stackoverflow.com/questions/24266114/pycharm-what-is-python-stubs

どのような状況でpython_stubsにジャンプしますか?

呼び出す関数が組み込み関数またはバイナリのみに存在する関数(pyファイルなし、pycのみなど)の場合、pycharmは特定のバージョンをハードコーディングして疑似関数を生成します(実際にはこれとは呼ばれませんが、実行すると便利です。開発)。

私たちの便宜のためにpycharmの骨の折れる努力について考えてください。

**補足知識:Python3カスタムログクラスmylog **

コードを直接見てみましょう!

# encoding=utf-8import os, sys
import datetime
import time
classMylog(object):
# ルートフォルダ
root_dir = sys.path[0]
# ルートディレクトリ
root_path = sys.path[0]+ os.path.sep
# システムディレクトリ分割線
sys_sep = os.path.sep
# 構成
option ={
# ログレベル:0:すべて、1:デバッグ、2:警告、3:エラー
' level':0,
# 開くかどうか、閉じている場合は、出力もログもありません
' is_open': True,
# 出力を印刷するかどうか
' is_print': True,
# ログファイルに記録するかどうか
' is_write': True,
# 各ログコンテンツの前に付けるかどうか
' is_prefix': True,
# 各ログの前にプレフィックスを有効にする場合は、ログレベルのプレフィックスを1に設定します
' level_1_prefix':'Test: ',
# 各ログの前にプレフィックスを有効にする場合は、ログレベルのプレフィックスを2に設定します
' level_2_prefix':'Warning: ',
# 各ログの前にプレフィックスを有効にする場合は、ログレベルのプレフィックスを3に設定します
' level_3_prefix':'Error: ',
# ログファイルが保存されているルートフォルダの名前
' root_dir_name':'mylog',
# ログファイルを保存するためのファイル名をカスタマイズします。このフォルダーはルートにあります_dir_名前フォルダ
' 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']
# フォルダーを作る
if os.path.isdir(save_dir) is not True:
os.mkdir(save_dir)iflen(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()**重要なコンテンツ
#! /usr/bin/env python
#- *- coding: GBK -*-
__ author__ ='DiaoHuabin'import logging
import getpass
import sys
# MyLogクラスを定義します
classMyLog(object):'''このクラスは、個人使用のログを作成するために使用されます'''
def __init__(self): #クラスMyLogのコンストラクタ
user = getpass.getuser() #ユーザーのログイン名を返します
self.logger = logging.getLogger(user) #特定の名前のログを返す
self.logger.setLevel(logging.DEBUG) #表示されるログ情報を表示しないように、DEBUGレベルより低いしきい値を設定します
logFile ='./'+sys.argv[1][0:-3]+'.log' #ログファイル名
formatter = logging.Formatter('%(asctime)-12s $(levelname)-8s %(name)-10s %(message)-12s')'''ログが画面に表示され、ログファイルに出力されます'''
logHand = logging.FileHandler(logFile) #出力ログファイル。ファイル名はlogFileです。
logHand.setFormatter(formatter) #フォーマッタでlogHandをフォーマットします
logHand.setLevel(logging.ERROR) #エラーのみがログファイルに記録されます
logHandSt = logging.StreamHandler() #classlogging.StreamHandler(stream=None)
# StreamHandlerクラスのインスタンスを返します。ストリームが決定された場合は、ログ出力としてストリームを使用します。それ以外の場合は、
# sys.stderr
logHandSt.setFormatter(formatter) #フォーマッタでlogHandStをフォーマットします
self.logger.addHandler(logHand) #特定のハンドラlogHandをログファイルロガーに追加します
self.logger.addHandler(logHandSt) #特定のハンドラlogHandStをログファイルロガーに追加します
''' ログの5つのレベルは、次の5つの機能に対応します。'''
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")

上記のpycharmpython_stubsの問題は、エディターによって共有されるすべてのコンテンツです。参照を提供したいと思います。

Recommended Posts

pycharmのpython_stubs問題