You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			52 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			52 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
| import pydoc
 | |
| from contextlib import suppress
 | |
| from typing import Dict, Optional
 | |
| 
 | |
| from jedi.inference.names import AbstractArbitraryName
 | |
| 
 | |
| try:
 | |
|     from pydoc_data import topics
 | |
|     pydoc_topics: Optional[Dict[str, str]] = topics.topics
 | |
| except ImportError:
 | |
|     # Python 3.6.8 embeddable does not have pydoc_data.
 | |
|     pydoc_topics = None
 | |
| 
 | |
| 
 | |
| class KeywordName(AbstractArbitraryName):
 | |
|     api_type = 'keyword'
 | |
| 
 | |
|     def py__doc__(self):
 | |
|         return imitate_pydoc(self.string_name)
 | |
| 
 | |
| 
 | |
| def imitate_pydoc(string):
 | |
|     """
 | |
|     It's not possible to get the pydoc's without starting the annoying pager
 | |
|     stuff.
 | |
|     """
 | |
|     if pydoc_topics is None:
 | |
|         return ''
 | |
| 
 | |
|     h = pydoc.help
 | |
|     with suppress(KeyError):
 | |
|         # try to access symbols
 | |
|         string = h.symbols[string]
 | |
|         string, _, related = string.partition(' ')
 | |
| 
 | |
|     def get_target(s):
 | |
|         return h.topics.get(s, h.keywords.get(s))
 | |
| 
 | |
|     while isinstance(string, str):
 | |
|         string = get_target(string)
 | |
| 
 | |
|     try:
 | |
|         # is a tuple now
 | |
|         label, related = string
 | |
|     except TypeError:
 | |
|         return ''
 | |
| 
 | |
|     try:
 | |
|         return pydoc_topics[label].strip() if pydoc_topics else ''
 | |
|     except KeyError:
 | |
|         return ''
 |