Python 程序员应该知道的 10 个库
- - 博客 - 伯乐在线Python是优雅的,使用这些库可以使你的代码更简洁,并保持持久性. 抛弃   optparse和   argparse吧,使用   docstrings来构建优雅的,可读性强的,并且复杂(如果你需要的话)的命令行界面. IMO2013年创建的最好的库. Requests,或称为人类使用的HTTP,是一个处理HTTP请求更为pythonic 的方法,比   urllib2更更更好用. 
 
  2011-08-22 17:52:54,828 - root - ERROR - [Errno 10104] getaddrinfo failed Traceback (most recent call last): File "<string>", line 124, in main File "<string>", line 20, in __init__ File "h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/wx._core", line 7978, in __init__ File "h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/wx._core", line 7552, in _BootstrapApp File "<string>", line 84, in OnInit File "h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/twisted.internet.wxreactor", line 175, in install File "h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/twisted.internet._threadedselect", line 106, in __init__ File "h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/twisted.internet.base", line 488, in __init__ File "h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/twisted.internet.posixbase", line 266, in installWaker File "h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/twisted.internet.posixbase", line 74, in __init__ File "h:workspaceprojectbuildpyi.win32mrdjoutPYZ1.pyz/socket", line 224, in meth gaierror: [Errno 10104] getaddrinfo failed
print 'Start reading database' records = model.read_recrods() print '# records', records print 'Updating record ...' model.update_records(records) print 'done'
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
 
logger.info('Start reading database')
# read database here
 
records = {'john': 55, 'tom': 66}
logger.debug('Records: %s', records)
logger.info('Updating records ...')
# update records here
 
logger.info('Finish updating records')
 INFO:__main__:Start reading database INFO:__main__:Updating records ... INFO:__main__:Finish updating records
logging.basicConfig(level=logging.DEBUG)
INFO:__main__:Start reading database
DEBUG:__main__:Records: {'john': 55, 'tom': 66}
INFO:__main__:Updating records ...
INFO:__main__:Finish updating records
 
import logging
 
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
 
# create a file handler
 
handler = logging.FileHandler('hello.log')
handler.setLevel(logging.INFO)
 
# create a logging format
 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
 
# add the handlers to the logger
 
logger.addHandler(handler)
 
logger.info('Hello baby')
 
def complex_algorithm(items):
    for i, item in enumerate(items):
        
# do some complex algorithm computation
 
        logger.debug('%s iteration, item=%s', i, item)
 
def handle_request(request):
    logger.info('Handling request %s', request)
    
# handle request here
 
    result = 'result'
    logger.info('Return result: %s', result)
 
def start_service():
    logger.info('Starting service at port %s ...', port)
    service.start()
    logger.info('Service is started')
 
def authenticate(user_name, password, ip_address):
    if user_name != USER_NAME and password != PASSWORD:
        logger.warn('Login attempt to %s from IP %s', user_name, ip_address)
        return False
    
# do authentication here
 
def get_user_by_id(user_id):
    user = db.read_user(user_id)
    if user is None:
        logger.error('Cannot find user with user_id=%s', user_id)
        return user
    return user
 
try:
    open('/path/to/does/not/exist', 'rb')
except (SystemExit, KeyboardInterrupt):
    raise
except Exception, e:
    logger.error('Failed to open file', exc_info=True)
 
ERROR:__main__:Failed to open file
Traceback (most recent call last):
  File "example.py", line 6, in <module>
    open('/path/to/does/not/exist', 'rb')
IOError: [Errno 2] No such file or directory: '/path/to/does/not/exist'
 
import logging
 
logger = logging.getLogger(__name__)
 
def foo():
    logger.info('Hi, foo')
 
class Bar(object):
    def bar(self):
        logger.info('Hi, bar')
 
import logging
 
logger = logging.getLogger(__name__)
 
def foo():
    logger.info('Hi, foo')
 
class Bar(object):
    def bar(self):
        logger.info('Hi, bar')
 [loggers] keys=root [handlers] keys=consoleHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=consoleHandler [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=simpleFormatter args=(sys.stdout,) [formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s datefmt=
import logging
 
def foo():
    logger = logging.getLogger(__name__)
    logger.info('Hi, foo')
 
class Bar(object):
    def __init__(self, logger=None):
        self.logger = logger or logging.getLogger(__name__)
 
    def bar(self):
        self.logger.info('Hi, bar')
 
import logging
import logging.config
 
logger = logging.getLogger(__name__)
 
# load config from file 
 
# logging.config.fileConfig('logging.ini', disable_existing_loggers=False)
 
# or, for dictConfig
 
logging.config.dictConfig({
    'version': 1,              
    'disable_existing_loggers': False,  
# this fixes the problem
 
    'formatters': {
        'standard': {
            'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
        },
    },
    'handlers': {
        'default': {
            'level':'INFO',    
            'class':'logging.StreamHandler',
        },  
    },
    'loggers': {
        '': {                  
            'handlers': ['default'],        
            'level': 'INFO',  
            'propagate': True 
        }
    }
})
 
logger.info('It works!')
 
{
    "version": 1,
    "disable_existing_loggers": false,
    "formatters": {
        "simple": {
            "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
        }
    },
 
    "handlers": {
        "console": {
            "class": "logging.StreamHandler",
            "level": "DEBUG",
            "formatter": "simple",
            "stream": "ext://sys.stdout"
        },
 
        "info_file_handler": {
            "class": "logging.handlers.RotatingFileHandler",
            "level": "INFO",
            "formatter": "simple",
            "filename": "info.log",
            "maxBytes": 10485760,
            "backupCount": 20,
            "encoding": "utf8"
        },
 
        "error_file_handler": {
            "class": "logging.handlers.RotatingFileHandler",
            "level": "ERROR",
            "formatter": "simple",
            "filename": "errors.log",
            "maxBytes": 10485760,
            "backupCount": 20,
            "encoding": "utf8"
        }
    },
 
    "loggers": {
        "my_module": {
            "level": "ERROR",
            "handlers": ["console"],
            "propagate": "no"
        }
    },
 
    "root": {
        "level": "INFO",
        "handlers": ["console", "info_file_handler", "error_file_handler"]
    }
}
 
---
 
version: 1
 
disable_existing_loggers: False
 
formatters:
 
    simple:
 
        format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
 
handlers:
 
    console:
 
        class: logging.StreamHandler
 
        level: DEBUG
 
        formatter: simple
 
        stream: ext://sys.stdout
 
    info_file_handler:
 
        class: logging.handlers.RotatingFileHandler
 
        level: INFO            
 
        formatter: simple
 
        filename: info.log
 
        maxBytes: 10485760 
# 10MB
 
        backupCount: 20
 
        encoding: utf8
 
    error_file_handler:
 
        class: logging.handlers.RotatingFileHandler
 
        level: ERROR            
 
        formatter: simple
 
        filename: errors.log
 
        maxBytes: 10485760 
# 10MB
 
        backupCount: 20
 
        encoding: utf8
 
loggers:
 
    my_module:
 
        level: ERROR
 
        handlers: [console]
 
        propagate: no
 
root:
 
    level: INFO
 
    handlers: [console, info_file_handler, error_file_handler]
...
 
import json
import logging.config
 
def setup_logging(
    default_path='logging.json', 
    default_level=logging.INFO,
    env_key='LOG_CFG'
):
    
"""Setup logging configuration
 
    
"""
    path = default_path
    value = os.getenv(env_key, None)
    if value:
        path = value
    if os.path.exists(path):
        with open(path, 'rt') as f:
            config = json.load(f)
        logging.config.dictConfig(config)
    else:
        logging.basicConfig(level=default_level)
 
import os
import logging.config
 
import yaml
 
def setup_logging(
    default_path='logging.yaml', 
    default_level=logging.INFO,
    env_key='LOG_CFG'
):
    
"""Setup logging configuration
 
    
"""
    path = default_path
    value = os.getenv(env_key, None)
    if value:
        path = value
    if os.path.exists(path):
        with open(path, 'rt') as f:
            config = yaml.load(f.read())
        logging.config.dictConfig(config)
    else:
        lo
 LOG_CFG=my_logging.json python my_server.py
LOG_CFG=my_logging.yaml python my_server.py