2016-04-13 12 views
0

は、開始アドレスの形式でIPアドレスの範囲を保持するための小さなテーブルの終了アドレス、および範囲内のIPアドレスの数SQLAlchemyで文脈依存関数をパラメータとともに使用できますか?ここ

class IpRange(Base): 
    __tablename__ = 'ip_range' 
    ip_range_id = Column(Integer, Sequence('ip_range_id_seq'), primary_key=True) 
    start_ip = Column(String(15)) 
    end_ip = Column(String(15)) 
    num_ips = Column(Integer) 

私は何をしてみたいことはオブジェクトを作成することができるようですさまざまなスタイルを使用して、クラスに独自のフィールドを設定する方法を理解させます。

foo = IpRange(ip='192.168.0.1') 
foo = IpRange(ip='192.168.0.0/24') 
foo = IpRange(ip='192.168.0.0-192.168.0.255') 

さまざまなIPアドレス/範囲の表記を解析でき機能を書くには余りにも難しいことではないでしょう。

def parseIp(desired_format): 
    ... stuff to parse any valid IP address/network format ... 
    if desired_format == 'start': 
     return start_ip 
    if desired_format == 'end': 
     return end_ip 
    if desired_format == 'num_ips': 
     return num_ips 

そして私は、私は、その後に自分の列のdefault方法を使用することができます期待していました

class IpRange(Base): 
    __tablename__ = 'ip_range' 
    ip_range_id = Column(Integer, Sequence('ip_range_id_seq'), primary_key=True) 
    start_ip = Column(String(15), default=parseIp('start')) 
    end_ip = Column(String(15), default=parseIp('end')) 
    num_ips = Column(Integer, default=parseIp('num_ips') 

ただし、これは有効なSQLAlchemy構文ではありません。ドキュメントにはcontext-sensitive default columnsが記載されていますが、この構文ではパラメータを関数に渡すことはできません。だから私はdefault=parseIpで関数を呼び出すことができますが、私はそれが私が探している戻り値の種類を伝えることができません。

SQLAlchemyの列指定内でこれを行う方法はありますか?

また、別のアイデアとして、parseIpをヘルパースクリプトに変えて、新しいIpRangeオブジェクト自体を生成し、それを呼び出し側に返すべきですか?次のようなもの:

def parseIp(ipstring): 
    ... parse data ... 
    return IpRange(start_ip=parsed_start_ip, end_ip=parsed_end_ip, num_ips=parsed_num_ips) 

>>> ipobj = parseIp('192.168.0.0/24') 

答えて

0

コンストラクタをオーバーライドするだけです。例:

class IpRange(Base): 
    def __init__(self, ip=None, **kwargs): 
     if ip is not None: 
      self.start_ip, self.end_ip = my_super_awesome_cidr_parser(ip) 
     else: 
      super(IpRange, self).__init__(**kwargs) 
+0

素晴らしい!私はその仕組み(最後の行は特に不思議です)を完全に理解していませんが、実際にはうまくいきます。ありがとうございました! –

+1

@GeorgeAdams最後の行は、スーパークラスの( 'Base')コンストラクタを呼び出して、キーワード引数で属性を設定するデフォルトの動作を使用できるようにします(例えば、' IpRange(start_ip = "..."、end_ip = "... ")')。 'super()'のドキュメントは[こちら](https://docs.python.org/2/library/functions.html#super)です。 – univerio

+0

私は理解していると思います。 "ip"が指定されていなければ)適切なことは伝統的な方法で 'IpRange'オブジェクトを作成することです(' foo = IpRange(start_ip = '...') ')。私は '' IpRange''に元の '__init__'を使う必要があると思っていたと思いますが、私が言っていることは、IpRangeには' __init__'がなく、 'Base'には一つしかないということです。もう1つの質問 - なぜスーパー(IpRange)ではなくスーパー(IpRange、self)を呼びますか? –

関連する問題