class_docstr: Manipulate expressions using paths.
  
  EPath grammar in EBNF notation::
  
      literal   ::= /[A-Za-z_][A-Za-z_0-9]*/
      number    ::= /-?\d+/
      type      ::= literal
      attribute ::= literal "?"
      all       ::= "*"
      slice     ::= "[" number? (":" number? (":" number?)?)? "]"
      range     ::= all | slice
      query     ::= (type | attribute) ("|" (type | attribute))*
      selector  ::= range | query range?
      path      ::= "/" selector ("/" selector)*
  
  See the docstring of the epath() function.
class_docstr_tok: ["Manipulate","expressions","using","paths",".","EPath","grammar","in","EBNF","notation",":",":","literal",":",":=","\/","[","A-Za-z_","]","[","A-Za-z_0-9","]","*","\/","number",":",":=","\/-","?","\\d+\/","type",":",":=","literal","attribute",":",":=","literal","``","?","''","all",":",":=","``","*","''","slice",":",":=","``","[","``","number","?","(","``",":","''","number","?","(","``",":","''","number","?",")","?",")","?","``","]","''","range",":",":=","all","|","slice","query",":",":=","(","type","|","attribute",")","(","``","|","''","(","type","|","attribute",")",")","*","selector",":",":=","range","|","query","range","?","path",":",":=","``","\/","''","selector","(","``","\/","''","selector",")","*","See","the","docstring","of","the","epath","(",")","function","."]
docstr: Check if ``expr`` has any of ``attrs``. 
docstr_tok: ["Check","if","``","expr","``","has","any","of","``","attrs","``","."]
code: def _hasattrs(self, expr, attrs):
      """Check if ``expr`` has any of ``attrs``."""
      for attr in attrs:
          if not hasattr(expr, attr):
              return False
  
      return True
  
file_path: sympy/sympy/simplify/epathtools.py
imports: from sympy.core import Basic
label_desc: Use image node_id 4 for calling the EPath obj's underlying member method code with example usage: obj._hasattrs(expr, attrs) and returns: True, False